那些用 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 条回复
bthulu
2024 年 6 月 24 日
```启动很快,很爽,对业务并没有带来什么收益。因为发布的流程是很复杂的,并不是扔上去就直接给用户用```
这只是你们, 我们发布流程很复杂, 但是全自动化, 很快, 非常快, 1 秒不到就可以发布完毕
jheroy
2024 年 6 月 24 日
做 web 真不好说,不过我们公司是拿来做游戏服务器,相比于 c+lua, 和 c++来说,go 还是有很大优势的。
jheroy
2024 年 6 月 24 日
另外我们公司很多基础库都要求自己写的,虽然都有公共库但是不让用。通讯协议自己写, 加密算法自己写,连数据库序列化的库都是自己写的, 唯一能用第三方库的地方是接了其他公司的 sdk 。
yyttrr
2024 年 6 月 24 日
公有云上 弹性部署 启动速度很关键 能节约很多成本
xieren58
2024 年 6 月 24 日
不如 rust / zig...
sampeng
2024 年 6 月 24 日
so 。。。。为啥你要拿 golang 和 spring 比。golang 又不是来抢 java 饭碗的。有一个算一个 java 换 go 的都是内部没赛道卷了,得腾出空间来可以继续卷。
当考虑 spring 和 golang 的时候 golang 就已经舒了,golang 再牛逼也不可能和几十年开源社区比。要达到 golang 同样或接近效果的 java 也有很多解决方案,只是 spring 比较是事实上的 java 框架。
ZhcChen
2024 年 6 月 24 日
@jheroy 因为有 bug 可以自己马上改,哈哈哈
tiiis
2024 年 6 月 24 日
内存便宜,Java 好招人😅
tonyVex
2024 年 6 月 24 日
go 写些小项目还是行的,你们都用什么框架自动生成数据库的对应的 CRUD 逻辑?
yemoluo
2024 年 6 月 24 日
找一个 Golang 程序员,相比于 Java ,购买好多服务器了,但是,一个团队用 Golang 真的是护城河有没有?

我一个朋友天天吐槽技术 Leader,就是换不了,因为用了 Golang 。

其实我后来发现,用 .net 的包管理模式才是最好的,Model 层面单独发一个包。
james122333
2024 年 6 月 24 日
日志这种东西实现方法很多
你可以学 java 直接 panic 在最外层 resolve
也可以用个 goroutine 或 rpc 作为日志中心接收信息
golang 也可以 String interpolation
写日志其实还不错用
golang 现在的缺点就是工具链变肥肿了 不然其实也还不错 还多了范型可用
james122333
2024 年 6 月 24 日
另外不建议用注解方式依赖注入
你封装个方法呼叫 new 以及其结构内置方法即可
perfectlife
2024 年 6 月 24 日
在 k8s 里用 hpa 才能明白启动快的好处,java 服务都没有做 hpa 的价值,启动太慢了
james122333
2024 年 6 月 24 日
不想新增 struct map 存起来就好 不过很多东西用依赖注入也就多了 直接在某 package 弄个已导出变量也就完事 就像在 java 内直接在某命名空间弄个 static 变量也就完事 什么 redistemplate XxxMapper 搞成依赖注入简直浪费时间
NizumaEiji
2024 年 6 月 24 日
写过一丢丢 go 用过 kratos 框架
就我个人而言 go 开发体验实在称不上多好
vincent7245
2024 年 6 月 24 日
我也是 Java 程序员,现在已经跳过 go 直接用 rust 了。

平时写业务用 java spring 那一套,出活快。

要效率和内存,就用 rust 。

go 是谁? 真的不熟
Breacher
2024 年 6 月 24 日
要是觉得编译速度慢可以 go mod vendor, 这是 vendor 的一个好处,在 CI/CD 省一点点时间 🤷‍♂️
rahuahua
2024 年 6 月 24 日
@StinkyTofus 好奇问下写 WEB 服务,go 缺啥需要自己实现的
312ybj
2024 年 6 月 24 日
写过一年 Go , 因为 CTO 要转 Go ,普通 Java 服务,最低都要 2 核 4g ,但是 go 这玩意真不挑机器,200M 跑得嗖嗖的。真能减少很多机器成本。 但是随着而来的就是匮乏的生态,很多框架都需要自己二开,但是你要说好不好,公司让转,那就带薪学习,我现在又写回 Java 了,还写写 python , 要是做大型复杂项目的话,我还挑 Java ,复杂需求不在乎那点优化
wowbaby
2024 年 6 月 24 日
go 用过几次就没欲望用了,满屏的 if err != nil 真受不了,写 web 没有优势,就是给自己找罪受,宁愿用 java 或 php ,多省点时间休息。

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

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

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

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

© 2021 V2EX