当前子项目是 web 性质,转 golang 是因为当前项目的其他子项目的同事都用 golang ,只有我们是 Java 的。公司希望我们也转 golang 。现在用 golang 写了一个多月,遇到几个让我郁闷的地方。
*
号,导致出现各种问题,还不好查。上述纯粹牢骚,不想引起什么语言战争。只是现在这么写下去感觉我们这个子项目要来不及交付了。
1
zts1993 2016-04-19 15:51:21 +08:00
1. 库的话直接吧 那个库保存在本地然后递交上去,,我不太相信 godeps ,因为打包机器好像不能联网。。
2. 依赖管理我就不吐槽了。 3. 泛型呵呵呵 4. 不评价 5. 用最新的 idea eap 版本加最新的 go 插件,,但是经常失灵无比困扰, 好在我们组只是做后台 service , web 还是 java 的 |
2
wohenyingyu01 2016-04-19 15:51:33 +08:00
没有 c 语言基础,纯 java python 强制转 objective c 的路过,没有忘记加*的烦恼……
|
3
aszxqw 2016-04-19 16:08:26 +08:00
依赖管理是硬伤。
|
4
SpicyCat 2016-04-19 16:17:18 +08:00
用了一段时间 go ,语言本身还行,就是周边的工具不够强。比起 java 差太远
|
6
loading 2016-04-19 16:20:06 +08:00
python 转 golang ,有点不适应。
|
7
orvice 2016-04-20 00:50:26 +08:00
包管理比较无解....
1.6 后貌似是推荐用到的库可以放 vendor.... 感觉还是不好用 |
8
mengzhuo 2016-04-20 08:08:23 +08:00 via iPhone
1 、 2 用 vendor 。一定要老版本的话有 gb
3 用 interface ,多态算啥~建议你读读官方的 io.Reader 模块 4 没有统一的标准,要看集体的使用场景定的,经验是有疑问传指针。当然如果对象小而且不需要其他函数读取和改变的话,可以直接传。 总结下来 lz 应该是程序员新手而且还在阵痛期,我司的 Java 程序员( 5 年+)被我教会后用得嗷嗷叫, Python 也是 =。= |
9
gxm44 2016-04-20 10:22:30 +08:00
羡慕 ing ,想工作中用 golang 都没机会。。。。
|
10
weiweiwitch OP @mengzhuo 感谢回复
这个语言内置的官方库目前来说感觉比 Java 好用。很多东西写起来也比 Java 简洁,这个是我觉得还不错的地方。 关于 1 , vendor 我们已经在用了,这点解决了多个项目不会依赖同一个版本的第三方库的问题。 而这里其实是想说的是,一些第三方库没有语义化版本没有 tag 的问题,比如 redigo , github 上是看不到语义化版本这样的信息的, godep 导入进来后,记录的是非常长的 git 的 rev 信息。可能有人会说,作者能确保每次合并到 master 上的一定是稳定的版本。但没有语义化版本,有时候很难向别人解释为什么我当前要用这个版本。如果库之间有依赖关系,也很难看懂他们的依赖关系, A 库如果依赖 B 库,那么依赖的是 B 库哪个版本对外的接口?所以库缺少语义化版本,可能会对未来项目的长期维护造成麻烦,我们不敢随便升级库了,因为不知道是否有 API 的不兼容。 关于 2 ,没有私有仓库,只是觉得不方便,到不是什么大的问题。 godep 和 maven 在使用上还算接近。希望有组织能早日实现个私有仓库。之前写 nodejs 的东西,在中国这个大环境下,考虑是否将 node_modules 中的文件提交到版本库简直是噩梦。提交到项目版本库的话,项目要多几万个文件。不提交,根本没法获取依赖。 关于 3 ,是我自己说的有点问题,其实是想说没有抽象类的机制,一个接口有很多实现的时候导致要写许多重复的代码。 interface 的话,的确用起来比 Java 灵活很多。所以两者比较,感觉也没啥,多写点就多写点吧。 关于 4 ,我写过几年 C++,写过几年 Java 。 golang 的这种不加星号就不是指针的变量声明方式间接的引入了变量不可变性,不过在函数式编程没有普及开来的情况下,变量不可变的意义就不是太大了。所以就会发现周围的人为了实现功能以及为了以后维护省心点,写着写着,所有的方法或函数的参数都变成了传指针了。很少有人会认真考虑从我这个接口传进去的结构不能是指针,因为数据在内部是不可变的,并且产生多份数据对内部更深的代码是没有影响的。如果大家声明的所有变量几乎都是指针的话,个人感觉语法反着来可能更舒服一点,即一切皆引用(指针),当需求明确了或需要优化或结构数据不能在方法内部被修改时,再考虑将方法参数明确修改为值传递。目前很多其他语言也是这么实现的吧。 当然,现在 golang 有这种现成的变量不可变机制的话,也希望 golang 能更早的实现出可用性很强的函数式编程的范式来。 其实正如楼上各位提的, golang 语言本身 ok ,习惯了问题不大,目前感觉阵痛主要还是因为配套没跟上。 |
11
realpg 2016-04-20 11:30:01 +08:00
@weiweiwitch
1&2&5. Go 语言的配套,还有很长的路要走 3. 你还是 Java 算法思维太久了。 4. 这个个人认为不可取。你总做大型综合项目,才会把一些主要是特殊 struct 传来传去, golang 并不是只用来做大型综合项目的,我用 golang 主要做海量的小工具,有运维需要,有实际功能需要,还有 tcp socket 接口的小服务,规模小的项目,很多高级面向对象应用都有限,这种情况下引用传递的极少。不能用你自己的需求,你项目的需求去推测所有人的需求和使用量。而且我觉得你想法这有很大的因素是受 Java 传递对象皆引用的影响,你和你的同事们写东西都习惯性以传对象皆引用的思路设计算法。 |
12
narcotics 2016-04-20 12:35:50 +08:00
@echo1937 生态一致, C# 直接 完全覆盖 Java 了吧... 我两个都用,实在感觉不到除了生态以外 Java 有任何一点能比得上 C# 的...
|
13
mengzhuo 2016-04-20 13:17:26 +08:00
|
14
windyboy 2016-04-20 16:55:57 +08:00
golang 好像不提倡用第三方的库
如果能用官方的库实现的最好别用第三方,即便用也看清楚人家的代码再用 我觉得 java 的一大问题就是复杂的依赖性,也许对于初学者来说配置一下就可以 run 但实际项目又很难脱开各种依赖,尤其是引入 spring 这样的东西 最后的软件是一个什么样子,其实自己也不知道 而且长期维护也是一个负担 |
16
smalltalk 2016-04-20 22:35:11 +08:00
@windyboy “等你长大了,就成了我”,称 java 依赖能下载半个互联网的说法,是每一个新生语言自我辩护中最没见识的说辞。
|
17
windyboy 2016-04-20 22:56:31 +08:00
java 也可以写的依赖少,像现在比较热的 RxJava
关键还是看什么应用,怎么写 动不动就 spring 什么的,体积都小不了 |
18
narcotics 2016-04-22 09:29:01 +08:00
@smalltalk 据我了解, C# 的性能即使及不上 Java (这一点我也存疑),也远没有到了非 Java 不可的地步,说白了大家底层的思路基本是一样的,运行速度也就是半斤八两。至于 IDE ,更是仁者见仁的事情了
|
19
adsion 2016-07-24 12:08:15 +08:00
目前没有办法实现 golang 的 debug ,虽然 ieda 的 golang 插件可以实现,但是成功率很低....
|
20
zjyExcelsior 2016-08-06 16:18:35 +08:00
@weiweiwitch 你需要理解的是。。。 Go 的传参是传值的 copy 的~这样你就能理解传指针为何能修改原有变量的值,而传值只不能修改原有变量的值了。。。
|
21
is 2017-10-29 11:07:58 +08:00
感觉最不习惯的就是这个包管理了,非常不习惯,只能慢慢适应了
|
22
yyl719133368 2018-01-04 15:53:48 +08:00
不知道 vendor 吗? 忘记加* 不会报错吗? idea 的 debug 还不够吗?
|
23
yyl719133368 2018-01-04 15:54:31 +08:00
公司没有 gitlib 吗?
|
24
Defned 2018-01-09 15:15:23 +08:00
一直用 vs code 装 go 插件,调试妥妥点
|