golang, 开发效率低执行效率高的语言?

7 天前
 iintothewind

最近因为偶然的原因, 不得不用了一段时间的 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 了这么差的语法表达力, 怎么就成了简单清爽?

简陋敷衍的容错处理(Error Handling)

我接触到其它语言在写后端业务逻辑是, 对于 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 啥都不会.

16151 次点击
所在节点    程序员
178 条回复
mb4555
7 天前
2025 年 都上 ai 了 你说的这些问题 根本不是问题
jlkm2010
7 天前
不推荐新人学 go
maxwellz
7 天前
之前思考过这个问题,为啥这么多缺点,但是还有这么多公司选择 go 呢,想出来的有几点
1 、技术 leader 就是喜欢 go
2 、节省服务器资源
3 、因为语法糖少,写出来的屎山相比其他灵活的语言,能更快上手
zhady009
7 天前
Go 语法简陋就是事实啰嗦中的啰嗦, 目前主流语言里 C#在一个很好的平衡点
lhDream
7 天前
简单说一下我的看法,,, 一开始 go 打的旗号就是干掉 java,,,那作为 javaer 肯定要了解一下 go,,,但是发现并不好用,,,尤其是本身就是写业务的,语法也不比 java 突出,再加上还有方言 kotlin 可选; 然后 go 带来的性能提升还不如网络延时带来的高,内存优势反而不是 javaer 需要考虑的事,,那是公司该考虑的...
最后也不知是不是我的错觉, rust 反而比 go 用起来更舒服,
roundgis
7 天前
@lhDream go 我記得一開始標榜 system programming language 和 java 根本就不在一個賽道
etata
7 天前
没人用 c#吗? c#基本上可以满足所有的场景。。。。
me1onsoda
7 天前
函数式调试的时候不火葬场吗
lesismal
7 天前
我个人觉得 Java 开发效率是最低的.
—— 但这只是我个人对我个人用 Java 的感觉, 而不是我认为所有人用 Java 都如此.
—— 至于原因: 我个人不喜欢 Java 的臃肿, 所以一直抵触用 Java, 所以也没有学习过 Java 的那些框架.

很多说 Golang 开发效率低的人, 其实跟我类似, 首先他们嫌弃 Golang 提供的语法糖/特性太少, 其次他们也不熟悉 Golang 社区的成熟框架/解决方案. 而且这些人绝大多数都是做 CURD 对性能没太大需求, 所以带来的性能提升他们是睁眼瞎一样完全忽视.
他们从来没考虑过是不是因为他们自己都不够熟悉 Golang 的正确姿势和成熟方案, 而仅因为 Golang 没有其他语言的那些姿势和方案, 就来无脑喷 Golang 开发效率低.
这种类似的观点言论, 可以反映出他们自己的水平还不够高, 但我这里说他们水平不够高并不是贬义, 因为这些人很大一部分是经验年限比较少的, 多数人年轻时候都菜, 慢慢成长吧, 等自己真正脱离了 CURD 这个 Level 的时候, 真正懂得去思考系统和工程的时候才能给出客观评价.
wolfie
7 天前
骂到点子上了
Biem
7 天前
Golang 的定位就是 better C ,我司(某所)在嵌入式 CPU 上运行 web server ,拿 C 开发 web 后端就是折磨,Golang 是从众多语言中被筛选出来的,兼顾运行速度,平台兼容性,交叉编译工具链,库丰富度,内存安全,离线开发等特性,作为一名从 C 里解脱出来的开发人员已经非常知足且感激 Google 了。
thoo61871
7 天前
go 挺好的 谁写我都看得懂
zhaoziyuan1989
7 天前
@adoal Rust 自带的是 Result 和 Option 吧?
haierspi
7 天前
别扯效率了.. 现在 各种 AI 工具.. 多写那些荣誉代码 无非就是几个 tab 的事情
maigebaoer
7 天前
@maxwellz 哈哈哈,确实是屎山,还是没有抽象的屎山,大家都能看懂
iceheart
7 天前
对于执行个 Sleep 都要包个 try catch 的语言,实在是喜欢不起来。可读性不好,执行效率低,内存占用还高,一有问题还得分析 young gc 又 old gc 的,这么多恶心事儿,有啥好比的?
语言的比较,要挑刺儿就没有挑不出来的。
我们看一门语言,要看它的特性适合干什么,而不是想着它违背了我的习惯就全盘否定它。
程序员跟财务比写代码,销售跟运维比业务能力,这样比有什么意思?
msg7086
7 天前
@me1onsoda #108
可以尝试写测试,无副作用函数式的部分写测试可太简单了。这样基本轮不到你去调试就能把 bug 全干光。
Rehtt
7 天前
go 拉低了团队合作门槛,新手和老手写的代码都差不多
penll
7 天前
@iintothewind 就像 C#大部分人也是说成 Donet
gongxuanzhang
7 天前
@lasuar rust 聊开发效率我觉得是笑话

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

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

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

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

© 2021 V2EX