新项目从 Java 转 golang,转的有点疼啊,不知道要不要坚持下去

2016-04-19 15:42:20 +08:00
 weiweiwitch

当前子项目是 web 性质,转 golang 是因为当前项目的其他子项目的同事都用 golang ,只有我们是 Java 的。公司希望我们也转 golang 。现在用 golang 写了一个多月,遇到几个让我郁闷的地方。

上述纯粹牢骚,不想引起什么语言战争。只是现在这么写下去感觉我们这个子项目要来不及交付了。

23953 次点击
所在节点    程序员
24 条回复
zts1993
2016-04-19 15:51:21 +08:00
1. 库的话直接吧 那个库保存在本地然后递交上去,,我不太相信 godeps ,因为打包机器好像不能联网。。
2. 依赖管理我就不吐槽了。
3. 泛型呵呵呵
4. 不评价
5. 用最新的 idea eap 版本加最新的 go 插件,,但是经常失灵无比困扰,


好在我们组只是做后台 service , web 还是 java 的
wohenyingyu01
2016-04-19 15:51:33 +08:00
没有 c 语言基础,纯 java python 强制转 objective c 的路过,没有忘记加*的烦恼……
aszxqw
2016-04-19 16:08:26 +08:00
依赖管理是硬伤。
SpicyCat
2016-04-19 16:17:18 +08:00
用了一段时间 go ,语言本身还行,就是周边的工具不够强。比起 java 差太远
echo1937
2016-04-19 16:19:02 +08:00
@SpicyCat 其实就是生态,否则 C#完全可以和 Java 五五开。
loading
2016-04-19 16:20:06 +08:00
python 转 golang ,有点不适应。
orvice
2016-04-20 00:50:26 +08:00
包管理比较无解....

1.6 后貌似是推荐用到的库可以放 vendor....

感觉还是不好用
mengzhuo
2016-04-20 08:08:23 +08:00
1 、 2 用 vendor 。一定要老版本的话有 gb
3 用 interface ,多态算啥~建议你读读官方的 io.Reader 模块
4 没有统一的标准,要看集体的使用场景定的,经验是有疑问传指针。当然如果对象小而且不需要其他函数读取和改变的话,可以直接传。

总结下来 lz 应该是程序员新手而且还在阵痛期,我司的 Java 程序员( 5 年+)被我教会后用得嗷嗷叫, Python 也是 =。=
gxm44
2016-04-20 10:22:30 +08:00
羡慕 ing ,想工作中用 golang 都没机会。。。。
weiweiwitch
2016-04-20 10:34:17 +08:00
@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 ,习惯了问题不大,目前感觉阵痛主要还是因为配套没跟上。
realpg
2016-04-20 11:30:01 +08:00
@weiweiwitch

1&2&5. Go 语言的配套,还有很长的路要走
3. 你还是 Java 算法思维太久了。
4. 这个个人认为不可取。你总做大型综合项目,才会把一些主要是特殊 struct 传来传去, golang 并不是只用来做大型综合项目的,我用 golang 主要做海量的小工具,有运维需要,有实际功能需要,还有 tcp socket 接口的小服务,规模小的项目,很多高级面向对象应用都有限,这种情况下引用传递的极少。不能用你自己的需求,你项目的需求去推测所有人的需求和使用量。而且我觉得你想法这有很大的因素是受 Java 传递对象皆引用的影响,你和你的同事们写东西都习惯性以传对象皆引用的思路设计算法。
narcotics
2016-04-20 12:35:50 +08:00
@echo1937 生态一致, C# 直接 完全覆盖 Java 了吧... 我两个都用,实在感觉不到除了生态以外 Java 有任何一点能比得上 C# 的...
mengzhuo
2016-04-20 13:17:26 +08:00
@weiweiwitch

关于第三点,如果重复的代码多的话,你应该考虑更高层的抽象了
特别是业务代码过多的话,完全可以用 go generate 生成代码
windyboy
2016-04-20 16:55:57 +08:00
golang 好像不提倡用第三方的库
如果能用官方的库实现的最好别用第三方,即便用也看清楚人家的代码再用
我觉得 java 的一大问题就是复杂的依赖性,也许对于初学者来说配置一下就可以 run
但实际项目又很难脱开各种依赖,尤其是引入 spring 这样的东西
最后的软件是一个什么样子,其实自己也不知道
而且长期维护也是一个负担
smalltalk
2016-04-20 22:33:11 +08:00
@narcotics 性能, idea
smalltalk
2016-04-20 22:35:11 +08:00
@windyboy “等你长大了,就成了我”,称 java 依赖能下载半个互联网的说法,是每一个新生语言自我辩护中最没见识的说辞。
windyboy
2016-04-20 22:56:31 +08:00
java 也可以写的依赖少,像现在比较热的 RxJava
关键还是看什么应用,怎么写
动不动就 spring 什么的,体积都小不了
narcotics
2016-04-22 09:29:01 +08:00
@smalltalk 据我了解, C# 的性能即使及不上 Java (这一点我也存疑),也远没有到了非 Java 不可的地步,说白了大家底层的思路基本是一样的,运行速度也就是半斤八两。至于 IDE ,更是仁者见仁的事情了
adsion
2016-07-24 12:08:15 +08:00
目前没有办法实现 golang 的 debug ,虽然 ieda 的 golang 插件可以实现,但是成功率很低....
zjyExcelsior
2016-08-06 16:18:35 +08:00
@weiweiwitch 你需要理解的是。。。 Go 的传参是传值的 copy 的~这样你就能理解传指针为何能修改原有变量的值,而传值只不能修改原有变量的值了。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/272267

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX