最近因为偶然的原因, 不得不用了一段时间的 go. 经过这一段时间的使用, 发现这门语言实在是有太多不爽的地方, 所以就在这里吐槽一下, 看看是不是因为我理解不对, 还是这就是 go 语言以及生态的缺陷.
go 的控制流非常简单: for, if, else, switch and defer 就是全部了 当然, 你如果之前对计算机语言所有的认知都来自于命令范式的语言(比如 C), 这并没有什么, 甚至觉得够用了.
但是对于偏函数式风格的语言, 这简直太简陋了, 函数式的控制流不仅有 for, if-else, 对于 switch 来说有更加强大的 pattern-match, 对于 defer 这种玩意, 有更好 try-catch-finally 替代, 而且你想怎么写就怎么写. 而且支持 unit, filter, map, flatMap 等等统一的操作.
golang 控制流的简陋直接造成了 golang 的语法表达能力差. 解决同样的问题, 需要更多更长的代码, 就像当年不支持 Lambda 特性的 Java 一样.
我就奇怪了: Java 没有支持 Lambda 以前, 人人骂 Java 代码啰嗦, 写起来累人, 到了 golang 了这么差的语法表达力, 怎么就成了简单清爽?
我接触到其它语言在写后端业务逻辑是, 对于 public 方法的入参是采取完全不信任的态度的. 原因很简单, 传进来的值在运行时存在非常多的可能, 最典型的就是 null 值一定要处理. 如果存在 a.b.c.d 等这样取值方式, 恐怕要不得不采用 Option 一层层去拿. 我可以理解有人说 Option 麻烦, 不管你用什么方式, 至少判空的逻辑是少不了的.
但是, Golang 是没有 Option 和 Try 的, golang 甚至连三元表达式都没有, 所以一般 Golang 是这样做的:
if a == nil { return nil, someError("...") }
b, err := a.b
if(err != nil) { return nil, someError("...") }
后面一大长串的 if(err != nil).......
如果你天天是写这样的代码, 你觉得这叫简洁?
其实 golang 的集合就只有个 array 和 map.
还有人说 array 的 slice 支持操作很方便啊? 我劝你醒醒, 看看其它语言吧, 就这几个操作哪个语言不支持啊?
Go 默认集合类型就是可变的, 所以所有对集合的操作, 实际上是修改集合自身. Go 是没有不可变集合这个概念的.
嗯, 找了找居然有人写了类似于 Linq 的 go-linq, 但是你看看相同的操作, go 得写多少代码吧, 而且每个操作结束时输出的变量居然时实现声明好再传进去的, 连直接输出到一个不可变集合的能力都没有.
其实我认为 Java 的数据库处理已经够老旧了. JDBC 标准已经很久没更新了, 而且很可能也不再更新了, 之前很多人期待的原生异步处理能力很可能不会再有了. Java 比较流行的 ORM 框架, hibernate 和 MyBatis 也已经非常老了, 老到都没办法在多线程环境下正常运行, 因为 Context 默认是单线程环境的. 但就这么老的 ORM 框架, 或许没办法跟.Net 的 linq 处理效率比一比, 但跟 Go 比起来也是好太多了.
来来来, Go 现在访问数据库, 有好的 ORM 框架吗? 有一个 sqlc 代码生成器, 大家已经觉得好太多了, 比自己写实在是快多了, 怎么不骂 Go 的数据库处理低效了, 就这??? 连个像样的 ORM 框架都没有.
Go 有泛型, 但又不支持方法级别的泛型.
Go 也没有泛型型变的概念.
所以你在接口上做一定程度的抽象, 绑定更多操作, 生成新的类型的实例是做不到的.
Golang 其实真的只是一个 Better C 的定位, 当然这还是在开发效率上来说的, 就是仅仅** Better-Than-C **. 但 Golang 这简陋的语法, 相对于其它非常多的现代语言来讲, 还是差的很多的.
可能 Go 语言的那几个掌舵人就是典型的命令范式计算机语言的拥趸, "嗯, 我们可绝不会加入任何函数式的特性, 这会增加这个语言的复杂度, 降低编译速度, 让语言不纯粹...."
您说您的, 但是 Go 写写底层就好了, 毕竟比 C 好. C 可是连数据类型概念都没有, 从来只操作内存的.
现在结构体都允许写接收方法了, 也能写点泛型了, 内存都帮你回收了, 你还想怎样?
什么? 你说用 Go 写业务逻辑很痛苦???
谁让你用 Go 写业务逻辑了, 跟你说了别去跟那帮写 Java 的混一起, 他们就只会 spring, 除了 spring 啥都不会.
101
mb4555 4 天前
2025 年 都上 ai 了 你说的这些问题 根本不是问题
|
102
jlkm2010 4 天前
不推荐新人学 go
|
103
maxwellz 4 天前
之前思考过这个问题,为啥这么多缺点,但是还有这么多公司选择 go 呢,想出来的有几点
1 、技术 leader 就是喜欢 go 2 、节省服务器资源 3 、因为语法糖少,写出来的屎山相比其他灵活的语言,能更快上手 |
104
zhady009 4 天前 1
Go 语法简陋就是事实啰嗦中的啰嗦, 目前主流语言里 C#在一个很好的平衡点
|
105
lhDream 4 天前
简单说一下我的看法,,, 一开始 go 打的旗号就是干掉 java,,,那作为 javaer 肯定要了解一下 go,,,但是发现并不好用,,,尤其是本身就是写业务的,语法也不比 java 突出,再加上还有方言 kotlin 可选; 然后 go 带来的性能提升还不如网络延时带来的高,内存优势反而不是 javaer 需要考虑的事,,那是公司该考虑的...
最后也不知是不是我的错觉, rust 反而比 go 用起来更舒服, |
107
etata 4 天前 2
没人用 c#吗? c#基本上可以满足所有的场景。。。。
|
108
me1onsoda 4 天前
函数式调试的时候不火葬场吗
|
109
lesismal 4 天前 2
我个人觉得 Java 开发效率是最低的.
—— 但这只是我个人对我个人用 Java 的感觉, 而不是我认为所有人用 Java 都如此. —— 至于原因: 我个人不喜欢 Java 的臃肿, 所以一直抵触用 Java, 所以也没有学习过 Java 的那些框架. 很多说 Golang 开发效率低的人, 其实跟我类似, 首先他们嫌弃 Golang 提供的语法糖/特性太少, 其次他们也不熟悉 Golang 社区的成熟框架/解决方案. 而且这些人绝大多数都是做 CURD 对性能没太大需求, 所以带来的性能提升他们是睁眼瞎一样完全忽视. 他们从来没考虑过是不是因为他们自己都不够熟悉 Golang 的正确姿势和成熟方案, 而仅因为 Golang 没有其他语言的那些姿势和方案, 就来无脑喷 Golang 开发效率低. 这种类似的观点言论, 可以反映出他们自己的水平还不够高, 但我这里说他们水平不够高并不是贬义, 因为这些人很大一部分是经验年限比较少的, 多数人年轻时候都菜, 慢慢成长吧, 等自己真正脱离了 CURD 这个 Level 的时候, 真正懂得去思考系统和工程的时候才能给出客观评价. |
110
wolfie 4 天前
骂到点子上了
|
111
Biem 4 天前 2
Golang 的定位就是 better C ,我司(某所)在嵌入式 CPU 上运行 web server ,拿 C 开发 web 后端就是折磨,Golang 是从众多语言中被筛选出来的,兼顾运行速度,平台兼容性,交叉编译工具链,库丰富度,内存安全,离线开发等特性,作为一名从 C 里解脱出来的开发人员已经非常知足且感激 Google 了。
|
112
thoo61871 4 天前 via iPhone
go 挺好的 谁写我都看得懂
|
113
zhaoziyuan1989 4 天前 via Android
@adoal Rust 自带的是 Result 和 Option 吧?
|
114
haierspi 4 天前
别扯效率了.. 现在 各种 AI 工具.. 多写那些荣誉代码 无非就是几个 tab 的事情
|
115
maigebaoer 4 天前 via Android
@maxwellz 哈哈哈,确实是屎山,还是没有抽象的屎山,大家都能看懂
|
116
iceheart 3 天前 via Android
对于执行个 Sleep 都要包个 try catch 的语言,实在是喜欢不起来。可读性不好,执行效率低,内存占用还高,一有问题还得分析 young gc 又 old gc 的,这么多恶心事儿,有啥好比的?
语言的比较,要挑刺儿就没有挑不出来的。 我们看一门语言,要看它的特性适合干什么,而不是想着它违背了我的习惯就全盘否定它。 程序员跟财务比写代码,销售跟运维比业务能力,这样比有什么意思? |
118
Rehtt 3 天前 via Android
go 拉低了团队合作门槛,新手和老手写的代码都差不多
|
119
penll 3 天前
@iintothewind 就像 C#大部分人也是说成 Donet
|
120
gongxuanzhang 3 天前
@lasuar rust 聊开发效率我觉得是笑话
|
121
encro 3 天前
开发效率低?
没几个人反驳吗? |
123
wen20 3 天前
朋友,信我,一个语音没使用 5 年甚至 10 年以上时,没有发言权。 开惯三轮车吐槽拖拉机不好用。
|
124
fluyy 3 天前
以前主要写 C/C++。 现在写 go ,相比之下 go 简直不要太爽。
|
125
edisonwong 3 天前
开发效率高低取决你使用的场景,开发 devops ,云原生,k8s 用 go 写还是不错的
另外还来了句 [连个像样的 ORM 框架都没有] :“gorm 框架是一个已经迭代了 10+ 年的功能强大的 ORM 框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展” |
126
zhwguest 3 天前
应该说的是代码密度低,跟开发效率应该搭不上边。
的确 go 的语法真的太罗嗦了,跟现代化语言比起来,真的太老土了... |
127
xingjue 3 天前
喜欢花里胡哨的 java 仔都被 spring 那一套洗脑了 其实简单高效是未来语言发展的方向
|
128
KinBob 3 天前
@importmeta 6MB 是没有啥依赖直接返回 200 吗
|
130
nanpu 3 天前
[连个像样的 ORM 框架都没有] ,gorm 虽然效率低可不是什么不像样的 orm ,不喜欢 gorm 的语法可以用 fb 的 ent
|
131
kiwi95 3 天前 1
其实你说了那么多,但在主流语言中,Go 还是在开发效率,运行效率,还有运维成本三个方面做到了最好的平衡,再吐槽也没用,这个生态位只有 Go 一个选择。
|
132
wervserwe 3 天前
我也不理解 if err != nil 有啥问题,调函数不就得检查错误吗?
|
133
homewORK 3 天前
首先开发效率低从何说起? 语法糖少就开发效率低吗,我并不认为。
一个软件开发占用的时间并不比后续维护多。 一个通俗易懂的代码才是最关键的,花里胡哨的东西,让其他人如何着手? |
134
tpeng9240 3 天前
javaboy 学了一段时间 go ,过一段时间语法忘的差不多了😂
|
135
zmcity 3 天前
到现在还有人写这么一大堆讨论 go 呢,go 的特点就是擅长的地方极为擅长,不擅长的地方用你原来的语言就好了。
|
136
kitrap 3 天前 via Android
go 的场景是替代 php ,python web 开发部分,替代 c/c++应用层网络协议及服务端部分,替代 python 运维和云计算控制面之类的。
|
137
back0893 3 天前
够用就行
simple is the best |
138
lvlongxiang199 3 天前
我更偏爱 if err != nil, 控制流看着更清晰些. java 里的 `Integer.parseInt` 如果失败, 就直接抛异常. go 里的对应方法, 返回 (int, error), 能提醒调用者处理异常(给个默认值, 或者向上抛). 但没搞出类似 rust 的 `?` 的语法糖来避免 if err != nil 满天飞这点没得洗
感觉说 java 啰嗦大多是因为, 业务逻辑一行都没写, 先定义一堆 interface (哪怕只有一个 class 实现), 在定义一堆 setter, getter, toString, eqTo (有了 Immutables 能好很多) 我还是比较反感 orm, 稍微复杂点的 sql 用 orm 实现就费劲, 而且生成的 sql 不可控, 没法做些优化. 以及 n+1 之类的问题 https://blog.codinghorror.com/object-relational-mapping-is-the-vietnam-of-computer-science/ 多提一句, 感觉 golang 不适合做 web, 更适合搞重网络 IO 的应用 |
141
cookgo 3 天前
如果一门语言能方便快速的解决所有的问题,这不是垄断了嘛
|
142
Richared 3 天前
@importmeta #26 安卓手机内存都 16g 了,在这纠结服务器省钱? 2c1g 的服务器么?
|
143
windyboy 3 天前
如果和数据库交互一定要 ORM 的话,我只能说要么设计数据库的是天才,要么没有接触过真实业务
|
144
seansong 3 天前
哈哈,同样的语气,可以用来骂任何语言,目前还找不到完美的语言
年轻人,学会跟自己和解,学会跟语言和解,有些事情不一定非要争一个胜负,我们都是在不断的妥协中争取进步,我们都是在自己的喜好中寻找语言,如果看 go 不顺眼,就下次不用了就行,要不,推荐你来学学我现在主要在用的 rust ? 有时候,多写几行代码不是坏事,或许,理解为更高的 kpi ? |
145
zheng0432 3 天前
go 的理念不就是一切从简吗,try catch finally 不感觉太啰嗦了吗
|
146
Biem 3 天前
@roundgis Rust 调研过了,在验证交叉编译 mipsel 目标这关没过。Go 自己造编译器去适配各种 CPU 架构这点在兼容各种嵌入式设备上,Rust 相比还有一段路要走。当然确实最开始在语言选型阶段的时候 Rust 作为编译型的内存安全语言是考虑在内的。
|
147
cj323 3 天前
我也不喜欢 go ,很早就试过了但是写着感觉太蠢太啰嗦,一直没有再碰过。我还是喜欢写着爽,自由的语言,比如 JS ,Ruby ,Elixir 。
但我能理解喜欢 go 的人,语言简单稳定,没有太多花哨。我甚至认为 go 开发效率更高,就像 rob pike 的 unix 哲学,大道至简,less is more 。 |
148
jeesk 3 天前 via Android
一些服务准备迁移到 CF 的 worker 上,serverless 才是王道。
不到 20 个接口, 用 CF worker 太香了。 |
149
firstep 3 天前
@xingjue 该说不说,没喷到点上。up 说的问题没有一条跟 Spring 有关,纯粹是语法糖和轮子的丰富程度。Java 并不等于 Spring
@lvlongxiang199 确实啰嗦,面向接口编程跟 Java 没关系,只是在 Java 工程实践滥用了,但是工程实践是可以调整的。 |
150
asdfsadfsdf 3 天前 via Android
@seansong 爹味太重
|
151
james122333 3 天前 via Android
所有静态语言含 typescript 都是这样的 都是开发效率低
至于简洁那是因为这个语言杂讯较少 写法工整 少有语法糖扰乱视觉 |
152
jackmod 2 天前
前阵子边抄边写 go 弄了个命令行小工具,后来一直没用就把 go 忘光了。
现在在练 rust ,练差不多了重新学 go 。目的是减少对 py 的依赖。 当然,吃饭的吊命玩意依旧是 java ,老舒适区了。 |
154
Nasei 2 天前 1
go 比 java 强多了
当然,他们都被 C# 吊起来打 无奈国内公司的工作数量是 java >> GO > C# |
155
DeWjjj 2 天前
本来所有的语句都应该确认是否产生错误,并加以处理。
不然代码函数复合之后,你 debug 跳步都找疯了。 |
156
1055619878 2 天前
我用 go-zero 开发 java build 的时间 我已经调试完一个接口了 开发效率提高太多了 根本不是一个级别的
|
157
jheroy 2 天前
你说的这些我觉得都是优点,语法糖少说明同一个逻辑不通的人实现是差不多的,而不像其他语言一个人一个写法。另外还有就是编译快,可以完全静态链接,生成一个可执行文件,无任何依赖,不想其他语言要么依赖动态链接库,要么需要装解释器。至于啰嗦问题,现在都是 ai 补全了,重复代码 ai 还是很精准的。
|
159
kenvix 2 天前
新生代语言( Rust 、Kotin 、Go 等)里面就 golang 这个货最逆天,开时代倒车
|
161
Mexion 2 天前
别说开发效率低这种话,人家都说 go 很爽,大道至简
|
164
iseki 2 天前 via Android 1
Go 最大的优势是 CGO_ENABLED=0 ,连 glibc 都可以不要。这个特性真的很棒。<del>但是不支持 Windows 7 了,是个遗憾。</del>
|
166
capgrey 1 天前
怕是大学的《数据结构》都没有学好吧?"容错" "集合" "数据库处理" "泛型系统", 用词潦草。
|
167
bronyakaka 1 天前
如果是写业务的话 go 的开发效率是非常低的,连个三元表达式都没有,一行代码三行 err ,代码量非常庞大;不写业务还凑合
|
168
bronyakaka 1 天前
@james122333 如果没 err 你这话没问题,满屏 err 真能说简洁吗
|
169
xiaocaiji111 19 小时 2 分钟前
err 还好,封装一下,每步处理下可以提高代码健壮性,就是第三方库质量不高,star 很高。这几年很多库也不活跃了。又没有 eclipse 和 apache 基金会等等这些组织。都是找野生库用。一些常用库缺少企业级的生产验证。
业务开发还是分场景吧,有些场景 go 是比较好用的,选型就靠经验了。比如我们数据的一些业务,go 计算没有原生 decimal 类型,没有浮点数的各种操作比如 ROUND_UP, ROUND_DOWN 要么借助三方野生库,要么自己实现,无形增加了成本和潜在风险。 |
170
xiaocaiji111 19 小时 0 分钟前
@lesismal 开发效率并不觉得 java 比 go 低,很多时候复杂度并不是在于多敲几个字母上,现在 ai 和代码提示那么智能,都不是问题。
|
171
xiaomushen 17 小时 36 分钟前
开发效率一般,执行效率也一般。但,省内存啊。
|
172
xiaomushen 17 小时 34 分钟前
@Richared 对于只有几台或几十台服务器的中小型应用来说,golang 省内存,经济意义不大。
但是如果大型互联网公司,一套应用动辄几百个,数千个节点,上万个节点,那么,golang 每年可以省下大量的钱 |
173
layxy 13 小时 51 分钟前
简单又省内存,这就是优势,论性能和开发效率,说实话目前一般,目前有一些第三方库可以简化一些操作,但是毕竟不是原生特性,写起来稍微有点别扭
|
174
james122333 8 小时 38 分钟前 via Android
|
175
james122333 8 小时 36 分钟前 via Android
|
176
wudanyang 5 小时 6 分钟前
我觉得 golang 的开发者是真的从之前的语言中吸取了教训,并且对普通程序员的水平有一个比较清晰的认知
比如说 去掉三元运算符,map 的乱序输出,以及加上了 gc |
177
sardina 4 小时 36 分钟前 via iPhone
1.对于 err 处理最近感觉确实有点头疼 一个函数一半都是 err !=nil 🤣,不过还能接受,工作中写了一点 cpp ,处理错误的方法好多也是每次都判断一次,
2.可以看看 https://pkg.go.dev/container 这个包还有些扩展,slice 确实很简陋,连去重功能都没有,排序也必须调用 sort ,不能直接在 slice 里 sort ,这点确实很麻烦,(是和 dart 对比的,因为我在用 fluttee 开发一个软件 3.数据库目前我一直使用 gorm ,确实很麻烦,我的使用方式是封装成 dao ,每个数据表都给暴露出类似的接口,这样就可以用模版统一修改,外部调用自已拼数据到*gorm.Db 里,例如 ListX 、CreateX 、、UpdateX ,确实很简陋,不过我习惯了,gorm-gen 还没进行尝试 4 范型我也没开始用,或许该认真学下了 另外最近在自已的项目里用 golang 生成 wasm 作为一个插件热插拔到项目里,最近也在一直持续开发,编译的 wasm 文件巨大,这点确实很头痛,wasm 运行时是用的 wazero 无依赖可以编译到各个平台,还给扩展了在 wasm 连接网络的功能 https://github.com/labulakalia/wazero_net 总结来说就是对大部分应用性能够用,语法也够简洁,错误处理笨重,内置数据类型功能少 |