Golang 之禅

2020年02月25日

在本月初的 GopherCon 上,知名 Go 语言贡献者与布道师 Dave Cheney 发表了名为《The Zen of Go》的演讲,之后他整理了演讲内容在博客中分享,由于内容过长,他又写了一个简洁版本:

这里简单翻译一下简洁版本的内容:

编写简单、可读、可维护的 Go 代码的十个工程要点。

每个包实现单一目标

设计良好的 Go 软件包提供一个单一的思路,以及一系列相关的行为。一个好的 Go 软件包首先需要选择一个好名字,使用电梯法则(30 秒内向客户讲清楚一个方案),仅用一个词来思考你的软件包要提供什么功能。

明确处理错误

健壮的程序其实是由处理故障案例的片段组成的,并且需要在故障出现之前处理好。冗余的if err != nil { return err }比出了故障再一个个去处理更有价值。panic 和 recover 也一样。

尽早 return,不要深陷

每次缩进时都会在程序员的堆栈中添加另一个先决条件,这会占用他们短期内存中的 7±2 个片段。避免需要深层缩进的控制流。与其深入嵌套,不如使用守卫子句将成功路径保持在左侧。

并发权留给调用者

让调用者选择是否要异步运行你的库或函数,不要强制他们使用异步。

在启动 goroutine 之前,要知道它什么时候会停止

goroutines 拥有资源、锁、变量与内存等,释放这些资源的可靠方法是停止 goroutine。

避免包级别的状态

要完成明确和减少耦合的操作,需要通过提供类型需要的依赖项作为该类型上的字段,而不是使用包变量。

简单性很重要

简单性不是老练的代名词。简单并不意味着粗糙,它意味着可读性和可维护性。如果可以选择,请遵循较简单的解决方案。

编写测试以确认包 API 的行为

软件包的 API 是与使用者的一份合约,不管先后,不管多少,一定要进行测试。测试是确定合约的保证。要确保测试使用者可以观察和依赖的行为。

如果你认为速度缓慢,先通过基准测试进行验证

以性能之名会犯下许多危害可维护性的罪行。优化会破坏抽象、暴露内部和紧密耦合。如果要付出这样的代价,请确保有充分理由这样做。

节制是一种美德

适度使用 goroutine、通道、锁、接口与嵌套。

展开阅读全文
70 收藏
分享
加载中
精彩评论
“之禅/之道/之美”之类的名字都是装B文
2020-02-25 13:44
29
举报
在你阴阳怪气说话之前,你先把下面的“现代化js语法”说清楚了先:
{} + [] // 0
[] + {} // [Object Object]
[] + [] // ""
{} + {} // NaN
2020-02-27 12:03
6
举报
其中有一半是所有编程语言通用的
2020-02-25 14:09
5
举报
写过C/C++的人更会认同这些是理所当然的
2020-02-25 09:32
4
举报
冗余的if err != nil { return err }看起来很S-B,不要为丑陋的语法设计找借口,GO我只需要泛型和异常处理其他的你随意
2020-03-05 12:54
2
举报
最新评论 (37)
标题是Fuchsia。进来是go
2020-03-09 13:38
1
回复
举报
节制是一种美德,哈哈
2020-03-09 09:17
0
回复
举报
现有语言已经只是语意化的框架了。没啥美不美的,该有都得有,搞不定都搞不定。C之前的语言能定义系统,之后的被系统定义。
2020-03-06 11:15
0
回复
举报
狗shi一样的语法制造狗shi一样的哲学
2020-03-05 20:32
0
回复
举报
冗余的if err != nil { return err }看起来很S-B,不要为丑陋的语法设计找借口,GO我只需要泛型和异常处理其他的你随意
2020-03-05 12:54
2
回复
举报
你这不是自个找难受吗,为啥不找那些不丑陋的呢
2020-03-05 13:17
0
回复
举报
老板要求使用go,我也没办法,但是go还是有改进的空间的,就是更新太慢
2020-03-05 14:02
0
回复
举报
把老板开了.
2020-03-05 17:46
1
回复
举报
现代化编程语言的特性,Go还缺很多的,但是如果都加上了,编译速度就变得慢了。
2020-03-05 19:54
0
回复
举报
慢就慢点,异常处理和泛型加上基本问题不大,参考java
2020-03-05 20:07
0
回复
举报
都加上了,发现还是java好。
2020-03-06 12:56
0
回复
举报
那不一样,好吗
2020-03-06 13:58
0
回复
举报
嗯。java是擦拭方法,运行时做不了什么。
2020-03-10 13:01
0
回复
举报
C语言是最好的语言,没有之一
2020-03-05 11:45
0
回复
举报
看完后,更加认定了这是一段Go屁文章
2020-02-26 15:59
0
回复
举报
啥是守卫子句
2020-02-26 15:18
0
回复
举报
翻译问题,就是防止报错的if判断处理
2020-03-05 20:06
0
回复
举报
啊哦!
2020-03-17 09:51
0
回复
举报
节制是美德。。
2020-02-25 21:39
1
回复
举报
反正用惯了go,再也不觉得php是世界最好的语言了,每次还要加个美元符号,错误都是深藏不露,其他脚本也类似
2020-02-25 18:32
0
回复
举报
更多评论
37 评论
70 收藏
分享
返回顶部
顶部