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

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

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

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

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

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

要效率和内存,就用 rust 。

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

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

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

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

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

© 2021 V2EX