在本月初的 GopherCon 上,知名 Go 语言贡献者与布道师 Dave Cheney 发表了名为《The Zen of Go》的演讲,以后他整理了演讲内容在博客中分享,因为内容过长,他又写了一个简洁版本:程序员
这里简单翻译一下简洁版本的内容:并发
编写简单、可读、可维护的 Go 代码的十个工程要点。异步
每一个包实现单一目标函数
设计良好的 Go 软件包提供一个单一的思路,以及一系列相关的行为。一个好的 Go 软件包首先须要选择一个好名字,使用电梯法则(30 秒内向客户讲清楚一个方案),仅用一个词来思考你的软件包要提供什么功能。性能
明确处理错误测试
健壮的程序实际上是由处理故障案例的片断组成的,而且须要在故障出现以前处理好。冗余的if err != nil { return err }
比出了故障再一个个去处理更有价值。panic 和 recover 也同样。优化
尽早 return,不要深陷.net
每次缩进时都会在程序员的堆栈中添加另外一个先决条件,这会占用他们短时间内存中的 7±2 个片断。避免须要深层缩进的控制流。与其深刻嵌套,不如使用守卫子句将成功路径保持在左侧。翻译
并发权留给调用者设计
让调用者选择是否要异步运行你的库或函数,不要强制他们使用异步。
在启动 goroutine 以前,要知道它何时会中止
goroutines 拥有资源、锁、变量与内存等,释放这些资源的可靠方法是中止 goroutine。
避免包级别的状态
要完成明确和减小耦合的操做,须要经过提供类型须要的依赖项做为该类型上的字段,而不是使用包变量。
简单性很重要
简单性不是老练的代名词。简单并不意味着粗糙,它意味着可读性和可维护性。若是能够选择,请遵循较简单的解决方案。
编写测试以确认包 API 的行为
软件包的 API 是与使用者的一份合约,无论前后,无论多少,必定要进行测试。测试是肯定合约的保证。要确保测试使用者能够观察和依赖的行为。
若是你认为速度缓慢,先经过基准测试进行验证
以性能之名会犯下许多危害可维护性的罪行。优化会破坏抽象、暴露内部和紧密耦合。若是要付出这样的代价,请确保有充分理由这样作。
节制是一种美德
适度使用 goroutine、通道、锁、接口与嵌套。
文章转载自 OSCHINA 社区 [http://www.oschina.net]