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

8 天前
 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 啥都不会.

16168 次点击
所在节点    程序员
178 条回复
encro
7 天前
开发效率低?


没几个人反驳吗?
xsen
7 天前
@encro #121 没什么好反驳的,都是成年人了,选适合自己的就可以
wen20
7 天前
朋友,信我,一个语音没使用 5 年甚至 10 年以上时,没有发言权。 开惯三轮车吐槽拖拉机不好用。
fluyy
7 天前
以前主要写 C/C++。 现在写 go ,相比之下 go 简直不要太爽。
edisonwong
7 天前
开发效率高低取决你使用的场景,开发 devops ,云原生,k8s 用 go 写还是不错的
另外还来了句 [连个像样的 ORM 框架都没有] :“gorm 框架是一个已经迭代了 10+ 年的功能强大的 ORM 框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展”
zhwguest
7 天前
应该说的是代码密度低,跟开发效率应该搭不上边。

的确 go 的语法真的太罗嗦了,跟现代化语言比起来,真的太老土了...
xingjue
7 天前
喜欢花里胡哨的 java 仔都被 spring 那一套洗脑了 其实简单高效是未来语言发展的方向
KinBob
7 天前
@importmeta 6MB 是没有啥依赖直接返回 200 吗
roundgis
7 天前
@Biem 用 rust 会不会好点?
nanpu
7 天前
[连个像样的 ORM 框架都没有] ,gorm 虽然效率低可不是什么不像样的 orm ,不喜欢 gorm 的语法可以用 fb 的 ent
kiwi95
7 天前
其实你说了那么多,但在主流语言中,Go 还是在开发效率,运行效率,还有运维成本三个方面做到了最好的平衡,再吐槽也没用,这个生态位只有 Go 一个选择。
wervserwe
7 天前
我也不理解 if err != nil 有啥问题,调函数不就得检查错误吗?
homewORK
7 天前
首先开发效率低从何说起? 语法糖少就开发效率低吗,我并不认为。
一个软件开发占用的时间并不比后续维护多。 一个通俗易懂的代码才是最关键的,花里胡哨的东西,让其他人如何着手?
tpeng9240
7 天前
javaboy 学了一段时间 go ,过一段时间语法忘的差不多了😂
zmcity
7 天前
到现在还有人写这么一大堆讨论 go 呢,go 的特点就是擅长的地方极为擅长,不擅长的地方用你原来的语言就好了。
kitrap
7 天前
go 的场景是替代 php ,python web 开发部分,替代 c/c++应用层网络协议及服务端部分,替代 python 运维和云计算控制面之类的。
back0893
7 天前
够用就行
simple is the best
lvlongxiang199
7 天前
我更偏爱 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 的应用
lhDream
7 天前
@roundgis 没办法,很多公众号这么推的,,,不过他要不这么说我还不去了解呢..
VchentozV
7 天前

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

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

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

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

© 2021 V2EX