那些用 go 做业务系统的公司或者个人,真的感受都资源节省,开发效率提升了吗?

103 天前
 xiaocaiji111

接触 go 至少 5 年了。一直关注 go 的发展,期间也用 go 做过不少工具,最近一年引入了生产用来开发业务系统。简单的 api 项目非常简单轻量,但是需要手动处理的东西也很多。

生产中使用的是 gin 框架,依赖注入使用 wire ,也编写了很多工具类,该有的都有了。处理复杂场景时依然显得力不从心,也有很多令人疑惑的地方。在 java 中通过一个注解来切面,就可以实现关键接口日志的记录。比如 @Log("删除管理员")。而在 go 中就麻烦很多,需要为每个接口添加中间件,想获取后面执行方法的参数和返回值也相当困难。我们记录日志,也不可能只能记一句话,还需要操作人信息和操作参数及结果。

编译速度没有想象的快,很多时候改动文件多了后,要半天,当然没有改动,第二次启动就快的多了(我们用的 goland )。

二进制启动快,这是优点,但是好像并没有带来什么收益,只是从一个开发人员角度来看,启动很快,很爽,对业务并没有带来什么收益。因为发布的流程是很复杂的,并不是扔上去就直接给用户用,相比较验收等流程来说,1 秒和 10 秒 50 秒几乎忽略不计。

二进制包下,这也是优点,2 阶段构建,我们使用 docker 镜像可以达到整体就 20m 左右,而同样的 springboot 达到 130m 左右(进一步模块化可以达到 80 左右)。但是服务器和制品库之间都是内网,几乎没有感受到明显差别,只对第一次拉取镜像有点用,后续镜像层拉过的都不会重复拉取。

内存占用 go 真的很低,20m 左右,springboot 启动就要给 512 避免内存溢出,当前 128 甚至 64 也可以启动,但是就不能用了。我们的业务服务器都是 2 核 4G ,感觉 go 有点浪费的感觉。

大内存,这点 go 做的不好,固定频率的 GC 在大内存占用时停顿明显。毛刺明显,而不像 java 可以根据业务选择合适的垃圾收集器,调优下很平滑。go 甚至没有提供可以选择的参数。

编程体验,都说 go 好,但是我不这么认为,对于工具类,简单 api 项目,go 确实很好。简单。不需要任何复杂的依赖。但是对于有一定复杂度的项目,感觉 go 的内置库相当匮乏。比如在 java 中可以使用 stream 等一套下来就是最终的数据。而在 go 中即使借助外部库,也需要多步才能完成(别跟我说自己写一个,你去写)。

另外就是 error 问题,写的时候一步一处理。很稳健。但是也很烦。过几天回来看代码,只能看到满屏的 if err != nil 。正常的业务逻辑已经湮没在 error 的海洋里。又臭又长(等等,这个不是说的 java ?)

类型推断,声明变量时不用写类型。有好处也有坏处,好处是少巧几个字母,坏处也显而易见。比如,某个 controller 层调用 service 层代码。user := us.GetUser(ctx, uid),此时如果我想看下返回的数据结构必须到 service 层看,这层是看不到的,也点不进去,像 java UserResp user = us.GetUser(uid),直接点击 UserResp 就能快速到定义。而 go 层次一多就很烦,需要一层层,一层层到最后返回值的地方才能看到。

依然有空指针,nil pointer 。特别是解引用时遇到最多。比如*user.name

半吊子泛型,虽然 java 的泛型实现的也不怎样,但是作为程序员是不关心字节码层面和机器码层面如何实现的,只关心有无,好不好用。

生态,go 的生态云原生基础设施比较多(不是说云原生就是 go ,云原生概念反而是 spring 后面的公司提出来的),业务相关的比较少。而 java 就很多了,很多基金会的组件也很优秀,多如牛毛,java 不仅仅是一门语言,现在说 java 基本是说其对应的生态,包括 kotlin ,java 等等,选择太多甚至出现选择困难症。

说这些不是踩 go ,也不是吹捧 java 。各有各有优势的地方。在工作中依然会大量使用这两种语言。这里只是表达下自己工作中的感受,为后来者选择做个参考。

17240 次点击
所在节点    Go 编程语言
130 条回复
buffzty
103 天前
@Breacher 搭个 goproxy 服务更好点 vendor 太冗余了
fzls
103 天前
go 确实感觉很多地方很原始-。-没有 Java 那样有很多封装好的现成库或范式可用
grittiness
103 天前
@rahuahua 我是 go 的初学者,最近试了一下 go 写 web 就觉得 orm 用的很不自在,复杂的关联 sql 写起来很别扭,以及常见的分页查询,都得自己封装一遍,似乎没有通用的轮子可以直接拿来用的(大概率是我菜。。)
DOLLOR
103 天前
我写 java 都是 var 声明,反正编辑器会自动提示变量类型。
dengqianyi
103 天前
没人试试 goframe?很好用啊
duanzhanling
102 天前
云原生,GO 是神
lolizeppelin
102 天前
@grittiness
目前就一个凑活的 orm 。ent
也就凑活而已
kaktos
102 天前
老的 Java 项目可以通过 GraalVM 改造,编译成 native image ,启动速度上基本媲美 golang 了,内存占用也相对减少,但改造过程中问题也会很多,比如不支持反射等。总之,各个语言都在不断发展中,选择适合公司业务的语言就行,没必要为了选择而选择。。。
layxy
102 天前
开发效率说实话目前还是不如 java,java 的轮子足够多,流式编程确实比较爽,go 有些时候还是需要自己造(即便找到了相关开源组件有些不健全,有些还没 release)
Citrus
102 天前
接触了 Go 5 年,不知道 GC 可以调?是不是可以再深入了解一下。
madku
102 天前
做过几个项目就知道 Go 写业务是多么顺手
gimp
102 天前
抛开场景谈语言就是耍流氓。
dododada
102 天前
@grittiness 我以前 sql 都是手搓,因为 dba 要审核;后来试了试 orm 的那些方法,发现太罗嗦,还要去研究 orm 自身的用法,还不如手搓
Felldeadbird
102 天前
go error 确实痛楚。满屏代码 if err != nil 。

go 不少基础类库需要自己实现,不然就网上找,写起来挺痛苦的。这是我从 PHP 过来思考的。但是现在有了 AI ,一些库我都问 AI 拿,感觉这点已经不再是难题了。

gin 确实强大,开箱即用。结合 GORM ,虽然 GORM 用起来很奇怪,但是习惯后就很舒服了。

总的来说,开发效率感觉没有提升太大,感觉还有点慢。可能因为我刚写 go 吧。
lyxxxh2
102 天前
2 月写的吐槽注释。
/*
*
golang 没官方的 digest auth 支持 因此封装 http 客户端 废话吐槽:还没见过 http 客户端不支持 digest auth 的 让我开眼界了
digest auth 文章来源: https://stackoverflow.com/questions/39474284/how-do-you-do-a-http-post-with-digest-authentication-in-golang
resty 有 digest auth 但是 post put 都有 bug: net/http: HTTP/1.x transport connection broken: http: ContentLength=27 with Body length 0
这个代码很差 后面再优化了
*/

这生态令我无语了,浪费我一上午的时间。
hkdcl
102 天前
@picone Java 也是 C 的进化版,C++也是 C 的进化版。要看谁进化得好
fatpower
102 天前
省资源,启动快。服务规模没上去是很难体现这两个优势。
shellcodecow
102 天前
emmm...8845HS AMD CPU 64G DDR5 , 跑了个 k3s 和 4 个 pod pod 里面是 go 就好比筷子在西湖里面乱搅
8355
102 天前
你这种 2 核 4g 的小机是 php 的舒适区。。。
复杂度上没有到 go 的舒适区
java 就更不用说了。。。

我的理解
大型 curd 项目多人维护需要大量主流中间件支持一定是 java 最好 没有之一
go 适合用到 rpc 调用个别接口很有针对性的方面优势项,普通 curd 接口真不需要用 go 来写 不论 java 还是 php 都完爆
beneo
102 天前
钱多的团队玩 Go ,反正啥都可以自己造,没钱的团队用 Java ,招人很简单,Java 多如狗

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

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

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

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

© 2021 V2EX