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

16191 次点击
所在节点    程序员
178 条回复
Mexion
6 天前
别说开发效率低这种话,人家都说 go 很爽,大道至简
roundgis
6 天前
@Biem 確實 golang 如果不用 cgo

跨平台編譯就是改一下 target
wowbaby
6 天前
@kitrap 最近也不得不用 go ,用 go 写 web 我感觉就是给自己找茬,debug 这块太弱了,再说一般的中小型公司,还达不到语言性能瓶颈这级别吧!
iseki
6 天前
Go 最大的优势是 CGO_ENABLED=0 ,连 glibc 都可以不要。这个特性真的很棒。<del>但是不支持 Windows 7 了,是个遗憾。</del>
jheroy
5 天前
@kenvix 硬要杠就没意思了,说语音肯定带着配套一起说的,我不信你用语言只用语法,编译器解释器自己写。
capgrey
5 天前
怕是大学的《数据结构》都没有学好吧?"容错" "集合" "数据库处理" "泛型系统", 用词潦草。
bronyakaka
5 天前
如果是写业务的话 go 的开发效率是非常低的,连个三元表达式都没有,一行代码三行 err ,代码量非常庞大;不写业务还凑合
bronyakaka
5 天前
@james122333 如果没 err 你这话没问题,满屏 err 真能说简洁吗
xiaocaiji111
4 天前
err 还好,封装一下,每步处理下可以提高代码健壮性,就是第三方库质量不高,star 很高。这几年很多库也不活跃了。又没有 eclipse 和 apache 基金会等等这些组织。都是找野生库用。一些常用库缺少企业级的生产验证。

业务开发还是分场景吧,有些场景 go 是比较好用的,选型就靠经验了。比如我们数据的一些业务,go 计算没有原生 decimal 类型,没有浮点数的各种操作比如 ROUND_UP, ROUND_DOWN 要么借助三方野生库,要么自己实现,无形增加了成本和潜在风险。
xiaocaiji111
4 天前
@lesismal 开发效率并不觉得 java 比 go 低,很多时候复杂度并不是在于多敲几个字母上,现在 ai 和代码提示那么智能,都不是问题。
xiaomushen
4 天前
开发效率一般,执行效率也一般。但,省内存啊。
xiaomushen
4 天前
@Richared 对于只有几台或几十台服务器的中小型应用来说,golang 省内存,经济意义不大。
但是如果大型互联网公司,一套应用动辄几百个,数千个节点,上万个节点,那么,golang 每年可以省下大量的钱
layxy
4 天前
简单又省内存,这就是优势,论性能和开发效率,说实话目前一般,目前有一些第三方库可以简化一些操作,但是毕竟不是原生特性,写起来稍微有点别扭
james122333
4 天前
@bronyakaka

我可以理解 err 逐层传递 值为 null 和有 error 也是不同的 不爱用其实 panic 就好 封装的很简洁在 go 是做的到的
james122333
4 天前
@xiaomushen

不要用某些内建库如 fmt 即可 fmt.Sprintf 更是效能杀手
wudanyang
4 天前
我觉得 golang 的开发者是真的从之前的语言中吸取了教训,并且对普通程序员的水平有一个比较清晰的认知
比如说 去掉三元运算符,map 的乱序输出,以及加上了 gc
sardina
4 天前
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
总结来说就是对大部分应用性能够用,语法也够简洁,错误处理笨重,内置数据类型功能少
wingofsky
3 天前
我是产品经理,我用 GO 写了个数字货币自动交易的程序
24 年 3 月至今 ROI:500%,对应的大饼涨了 80%,最后一次重启是 70 多天前
平均内存:30MB ,每个月就交易所 WS 的流量稍微需要花点成本,其他的都是香港主机最低配

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

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

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

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

© 2021 V2EX