Go 的特色不是语法的便捷,而是在工程

2023-02-08 01:00:55 +08:00
 GopherDaily

Envoy 这样的工程构建已经是非常复杂了,当然 Go 大型工程也不简单。 但是入门写 Go 基本就一条路,入门 C++ 就很依赖人的主观判断。

学了两天 bazel ,又学了一天 cmake ,加深了这个想法。

7856 次点击
所在节点    Go 编程语言
77 条回复
dog82
2023-02-08 10:38:52 +08:00
没 go mod 之前,很痛苦的
GeruzoniAnsasu
2023-02-08 10:44:48 +08:00
@RedisMasterNode

语法不复杂,但是要写出 对 的程序,那可复杂到天上去了。要知道 golang 只有协程,但它不提供 **异步语法**

golang 没有 await ,这意味着你要完全自己手动处理所有 chan 和 并发开始的 goroutine 的关系和时序。2023 年了连 c++都能 await 协程了,golang 却还在用 select 和 pipe 手搓异步逻辑,我愿称其为 「 unix 原教旨主义」。


举个例子好了。你有一个 spwaner , 它能并发地生成若干 worker ,worker 的执行时长不确定。 现在有一个要求,所有 worker 的执行结果要按启动顺序写回到同一个与 spwaner 共享的 chan 里,开始你的头脑风暴。
Nazz
2023-02-08 10:52:37 +08:00
@GeruzoniAnsasu async 有传染性, 同步方式写异步代码对开发者更友好, 但是牺牲了性能.
RedisMasterNode
2023-02-08 10:59:41 +08:00
@GeruzoniAnsasu 我看你的描述很多时候只需要 wait group 吧。。wait group 的使用非常简单,只有需要 goroutine 间通信的时候才会需要 channel 呀,业务应用里面 goroutine 大部分场景都是用来并行做一些事情,例如并行发起 http 调用,我 golang 用了有小几年了没有感觉到什么不适而且觉得很好理解

当然你可能在描述一些多个 channel 之间共同协作,需要知道互相的结果,需要传递数据的情况,我不了解在其他语言怎么做的,但是我觉得常规开发里面写出这样的逻辑设计本来就已经对可读性不友好了,不能说只怪 golang 吧
xuyang2
2023-02-08 11:10:49 +08:00
@dqzcwxb #8 throw catch ...
yazinnnn
2023-02-08 11:15:20 +08:00
monad 鄙视一下 throw 和 try catch 也就算了, 这年头 if err != nil 都能鄙视 throw 了吗
star9029
2023-02-08 11:24:07 +08:00
c++ build system 是这样的,不过 cmake/xmake 的工程能 work ,而且 cmake 有大量成熟项目(这并不影响他难用)
gowk
2023-02-08 11:48:08 +08:00
@Nazz #19
Simplicity is Complicated
<amp-youtube data-videoid="rFejpH_tAHM" layout="responsive" width="480" height="270"></amp-youtube>
TtTtTtT
2023-02-08 11:53:25 +08:00
@RedisMasterNode
@lysS
最近读过的是 MinIO 的 EC pool 读写流程 hhh
ericls
2023-02-08 11:56:38 +08:00
我最近才开始真正写 go,

总之很喜欢 我也说不出具体原因 tooling 也很好 想写的东西甚至乱来 根据报错也能边学边写

这种喜欢可能有一部分来自于正在学习新东西的兴奋 但也只是一小部分
angrylid
2023-02-08 11:57:06 +08:00
又到了爷最爱的斧子党和锯子党互相鄙视环节。

有这时间不如多砍两棵树。
xiangyuecn
2023-02-08 12:03:18 +08:00
@xuyang2 #4 没写过 go ,如果 编写代码漏写了 if err != nil 会产生什么有趣的问题吗? 还是说不写 if err != nil 编译不过?
lysS
2023-02-08 12:06:53 +08:00
@TtTtTtT 大项目就是本就不好读,我弄数据库的,看 tidb 也是很恼火;即使注释写的很好,不是自己写的也缺少很多上下文
sadfQED2
2023-02-08 12:19:11 +08:00
@xiangyuecn 跟 java 漏写 try 差不多
blankmiss
2023-02-08 12:41:58 +08:00
if err != nil 还不如 try catch
hhjswf
2023-02-08 12:45:10 +08:00
@xuyang2 反人类的理由呢
hhjswf
2023-02-08 12:46:58 +08:00
如果觉得 try catch 恶心,aop 可以解决。go 有什么优雅一点异常处理
loading
2023-02-08 13:09:57 +08:00
@xiangyuecn 直接全局替换 err 为 _,直接就忽略了。
lanlanye
2023-02-08 13:37:18 +08:00
@xuyang2 很有问题啊,因为大多数需要异常处理的函数都得返回至少两个结果 (result, error) ,深层调用时每一层做的事就是执行函数,如果有 error 就往上一层抛,也会导致链式调用无法正常写出来,比如 `person.Pet().Name()` ,如果 Pet()方法是一个可能失败的 lazy load ,调用时就根本写不成这样。
目前我只见过 Gorm 那样把 error 直接放进返回值结构里的做法可以缓解这个问题,或者希望 Go 学一学 Rust 。
lanlanye
2023-02-08 13:39:08 +08:00
@fioncat 我一开始也是这么认为的,但它确实造成了不便,可以参考我在楼上的回复。另外 Rust 的处理方式就很好,它同样强迫你处理每一个 error 。

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

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

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

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

© 2021 V2EX