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

2024 年 6 月 24 日
 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 。各有各有优势的地方。在工作中依然会大量使用这两种语言。这里只是表达下自己工作中的感受,为后来者选择做个参考。

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

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

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

总的来说,开发效率感觉没有提升太大,感觉还有点慢。可能因为我刚写 go 吧。
lyxxxh2
2024 年 6 月 25 日
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
2024 年 6 月 25 日
@picone Java 也是 C 的进化版,C++也是 C 的进化版。要看谁进化得好
fatpower
2024 年 6 月 25 日
省资源,启动快。服务规模没上去是很难体现这两个优势。
shellcodecow
2024 年 6 月 25 日
emmm...8845HS AMD CPU 64G DDR5 , 跑了个 k3s 和 4 个 pod pod 里面是 go 就好比筷子在西湖里面乱搅
8355
2024 年 6 月 25 日
你这种 2 核 4g 的小机是 php 的舒适区。。。
复杂度上没有到 go 的舒适区
java 就更不用说了。。。

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

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

https://study.congcong.us/t/1052043

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

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

© 2021 V2EX