V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
weiweiwitch
V2EX  ›  程序员

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

  •  
  •   weiweiwitch · 2016-04-19 15:42:20 +08:00 · 23940 次点击
    这是一个创建于 3138 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • 库版本:库虽然没有 Java 多,但目前够用。只是发现好多库都没有版本没有 tag ,怎么保证应该获取哪个版本的库?如何保持 API 的统一?
    • 包依赖管理: godep 现在也初步够用,只是没有私有仓库,导致要把第三方库的源码都提交进项目的版本库后,内网环境下才能正常使用,否则其他同事取不到依赖包。
    • 多态和泛型的缺失:在实现一些逻辑性强需求又比较类似的功能时感觉力不从心。需要用组合和自定义构造函数的方式来模拟多态。
    • 指针:目前还没有弄明白什么地方应该不用指针。但是发现从其他语言转过来的同事经常忘记在变量中明确添加*号,导致出现各种问题,还不好查。
    • 工具: idea 下的 go 插件已经比较好用了,但是什么时候 idea 下才能有稳定的调试器。

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

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


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

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

    感觉还是不好用
    mengzhuo
        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 也是 =。=
    gxm44
        9
    gxm44  
       2016-04-20 10:22:30 +08:00
    羡慕 ing ,想工作中用 golang 都没机会。。。。
    weiweiwitch
        10
    weiweiwitch  
    OP
       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
        11
    realpg  
       2016-04-20 11:30:01 +08:00
    @weiweiwitch

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

    关于第三点,如果重复的代码多的话,你应该考虑更高层的抽象了
    特别是业务代码过多的话,完全可以用 go generate 生成代码
    windyboy
        14
    windyboy  
       2016-04-20 16:55:57 +08:00
    golang 好像不提倡用第三方的库
    如果能用官方的库实现的最好别用第三方,即便用也看清楚人家的代码再用
    我觉得 java 的一大问题就是复杂的依赖性,也许对于初学者来说配置一下就可以 run
    但实际项目又很难脱开各种依赖,尤其是引入 spring 这样的东西
    最后的软件是一个什么样子,其实自己也不知道
    而且长期维护也是一个负担
    smalltalk
        15
    smalltalk  
       2016-04-20 22:33:11 +08:00
    @narcotics 性能, idea
    smalltalk
        16
    smalltalk  
       2016-04-20 22:35:11 +08:00
    @windyboy “等你长大了,就成了我”,称 java 依赖能下载半个互联网的说法,是每一个新生语言自我辩护中最没见识的说辞。
    windyboy
        17
    windyboy  
       2016-04-20 22:56:31 +08:00
    java 也可以写的依赖少,像现在比较热的 RxJava
    关键还是看什么应用,怎么写
    动不动就 spring 什么的,体积都小不了
    narcotics
        18
    narcotics  
       2016-04-22 09:29:01 +08:00
    @smalltalk 据我了解, C# 的性能即使及不上 Java (这一点我也存疑),也远没有到了非 Java 不可的地步,说白了大家底层的思路基本是一样的,运行速度也就是半斤八两。至于 IDE ,更是仁者见仁的事情了
    adsion
        19
    adsion  
       2016-07-24 12:08:15 +08:00
    目前没有办法实现 golang 的 debug ,虽然 ieda 的 golang 插件可以实现,但是成功率很低....
    zjyExcelsior
        20
    zjyExcelsior  
       2016-08-06 16:18:35 +08:00
    @weiweiwitch 你需要理解的是。。。 Go 的传参是传值的 copy 的~这样你就能理解传指针为何能修改原有变量的值,而传值只不能修改原有变量的值了。。。
    is
        21
    is  
       2017-10-29 11:07:58 +08:00
    感觉最不习惯的就是这个包管理了,非常不习惯,只能慢慢适应了
    yyl719133368
        22
    yyl719133368  
       2018-01-04 15:53:48 +08:00
    不知道 vendor 吗? 忘记加* 不会报错吗? idea 的 debug 还不够吗?
    yyl719133368
        23
    yyl719133368  
       2018-01-04 15:54:31 +08:00
    公司没有 gitlib 吗?
    Defned
        24
    Defned  
       2018-01-09 15:15:23 +08:00
    一直用 vs code 装 go 插件,调试妥妥点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1289 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:37 · PVG 07:37 · LAX 15:37 · JFK 18:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.