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

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

14070 次点击
所在节点    Go 编程语言
129 条回复
fingerstyle
10 天前
Richared
10 天前
不知道什么时候开始,java 垃圾都成了政治正确了。
sagaxu
10 天前
开发效率不如 C#或者 Java ,但是省资源,CPU 未必省多少,但大项目内存起码省 50%,小项目能省 80%以上。Java Spring 全家桶启动成本高,最简单的小项目内存 300M 起跳。
ShuWei
10 天前
每个语言都有自己不同的设计思路,这种对比意义可能不是特别大,根据自己的能力、需求去选择适合自己的语言和框架就可以了
pkoukk
10 天前
不敢说和别的语言比,和 java 比,节省资源这一点有问题么?
丢到 k8s 里看下每月资源账单,还是能少不少的
0o0O0o0O0o
10 天前
<amp-youtube data-videoid="uwajp0g-bY4" layout="responsive" width="480" height="270"></amp-youtube>
main1234
10 天前
还在纠结语言问题......语言只是工具而已
SUMPaul
10 天前
基于 gin 简单封装一套 mysql+redis 的框架,后面开箱即用,改改配置然后 CRUD 就行
imbigbao
10 天前
[PHP--中国互联网最好使的背锅侠]( https://mp.weixin.qq.com/s/0fw8KTEt-3vrXaBeTAFMgw)

一般的业务系统开发,Java 第一、PHP 第二。不接受反驳。Go 目前的强项不在这方面
GoodAfternoon
10 天前
@seers 为什么你能发语音😄
itskingname
10 天前
我主要的编程语言是 Python ,偶尔用 Go 。给我的最大感受就是我写出来的 Go 代码基本上写完就能运行。最爽的一次,500 多行代码,写完以后没有任何调试,直接运行,完全满足要求。但用 Python 从来没有这么爽过。
xiaocaiji111
10 天前
@povsister 说了,只是发表个人看法,请不要带着情绪来,谢谢
securityCoding
10 天前
当我维护过 c++,scala 代码才知道谁才是小甜甜,一行 go mod tidy 直接起飞
xingjue
10 天前
说实话 效率和资源确实节省了太多 用了多年的经验哈 现在只用 go 和 js
dwu8555
10 天前
go 简单,好用,实用。这 3 点没有语言能出其右。
abc950309
10 天前
@imbigbao Java 最大的优点是国内的工程师红利,「深耕」 Java 的太多了,低端市场上很便宜。之前面试一个老哥,数据库索引说不明白,排序的复杂度不会算,面完之后问我为什么不问 Java 八股文。这种深入了解 Java 的人才,只能说最适合做「业务开发」了,真的是 CURD 小子的不二之选。
zoharSoul
10 天前
说的很中肯
muchengxue
10 天前
日志为什么每个接口添加中间件? 一个中间件就可以获取所有接口的请求参数和响应数据啊
Hanggi
10 天前
![图 1]( https://developer.qcloudimg.com/http-save/yehe-1391949/cf31c07c2463dba694084e15f9337f22.png)

![图 2]( https://developer.qcloudimg.com/http-save/yehe-1391949/2fc52b58f6865ec1c5459202bcdcbe8a.png)

10 年前的文章就已经解释这个问题了,不需要纠结。

只要你的需求与 go 语言的定位符合,那他就是你的首选。

如果你对开发的程序有开发效率、性能、资源利用效率、并发等方面有综合的需求,go 可以满足你。
如果你对单一方面有极高的需求,那么有很多其他语言比 go 语言更适合。
wen20
10 天前
基于 gin 封装的 api 框架, 也没有文档。
https://gitee.com/apiok/gofly_framework

代码自动生成工具。(发现工具不好用可以找我要最新的)
https://gitee.com/apiok/gofly-gen

如果你愿意花半天时间看看, 相信会改观对 go 的看法。
配置好 mysql , 运行 gofly-gen 自动生成代码。router, handler, service, dml, dal , model 层的代码全部自动生成。
根据 mysql table 生成 model , 其他层的代码会自动生成,自动解决 include. 加载。

有业务逻辑的地方在 service 层写代码。

别喷这什么垃圾,也没文档,本来就是自用的。

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

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

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

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

© 2021 V2EX