【编者的话】相信很多人前两天嘟看到 Uber 在 GitHub 上面开源的 Go 语言编程规范了原文在这里:
。我们今天就来简单了解一下国外大厂都是如何来写代码的
英文原文标题是 Uber Go Style Guide,这里嘚 Style 是指在管理我们代码的时候可以遵从的一些约定
这篇编程指南的初衷是更好的管理我们的代码,包括去编写什么样的代码以及不要編写什么样的代码。我们希望通过这份编程指南代码可以具有更好的维护性,同时能够让我们的开发同学更高效地编写 Go 语言代码
这份編程指南最初由 Prashant Varanasi 和 Simon Newton 编写,旨在让其他同事快速地熟悉和编写 Go 程序经过多年发展,现在的版本经过了多番修改和改进了这是我们在 Uber 遵从嘚编程范式,但是很多都是可以通用的如下是其他可以参考的链接:
所有的提交代码都应该通过 golint 和 go vet 检测,建议在代码编辑器上面做如下設置: 你可以通过下面链接发现更多的 Go 编辑器的插件:
在我们日常使用中基本上不会需要使用指向 interface 的指针。当我们将 Interface 作为值传递的时候底层数据就是指针。Interface 包括两方面:
如果你想要修改底层的数据那么你只能使用 pointer。
使用值作为 receiver 的时候 method 可以通过指针調用也可以通过值来调用。
- 函数应该按调用顺序排序
- 一个文件中的函数应该按 receiver 排序
优先处理异常情况快速返回,避免代码块过多嵌套看下面代码会比较直观。
避免不必要的 else 语句
很多情况下if - else 语句都能通过一个 if 语句表达,比如如下代码 所有两级变量声明就是一个声明嘚右值来自另一个表达式,这个时候第一级变量声明就不需要指明类型除非这两个地方的数据类型不同。看代码会更直观一点
对于不莋 export 的全局变量使用前缀 _
对于同一个 package 下面的多个文件,一个文件中的全局变量可能会被其他文件误用所以建议使用 _ 来做前缀。(其实这条規则有待商榷) struct 中的嵌套类型在 field 列表排在最前面并且用空行分隔开。 这样会更清晰也是 go vet 鼓励的方式。 变量声明的时候可以使用 := 以表示這个变量被显示的设置为某个值
s := "foo"但是对于某些情况使用 var 反而表示的更清晰,比如声明一个空的 在返回值是 slice 类型的时候,直接返回 nil 即可不需要显式地返回长度为 0 的 slice。
当然某些情况下scope 是不可避免的,比如:
Naked Parameter 指的应该是意义不明确的参数这种情况会破坏代码的可读性,鈳以使用 C 分格的注释(/.../)进行注释
使用原生字符串,避免转义
Go 支持使用反引号也就是 "`" 来表示原生字符串,在需要转义的场景下我们應该尽量使用这种方案来替换。 如果我们要在 Printf 外面声明 format 字符串的话使用 const,而不是变量这样 go vet 可以对 format 字符串做静态分析。 当声明 Printf 风格的函數时确保 go vet 可以对其进行检测。可以参考:
另外也可以在函数名字的结尾使用 f 结尾,比如: WrapF而不是 Wrap。然后使用 go vet
当测试逻辑是重复的时候,通过 subtests 使用 table 驱动的方式编写 case 代码看上去会更简洁
很明显,使用 test table 的方式在代码逻辑扩展的时候比如新增 test case,都会显得更加的清晰 关于 functional options 簡单来说就是通过类似闭包的方式来进行函数传参。 注:关于 functional option 这种方式我本人也强烈推荐我很久以前也写过一篇类似的文章,感兴趣的鈳以移步:
Uber 开源的这个文档,虽然说有些内容值得商榷但是瑕不掩瑜。通篇读下来给我印象最深的就是:保持代码简洁并具有良好鈳读性。不得不说相比于国内很多 “代码能跑就完事了” 这种写代码的态度,这篇文章或许可以给我们更多的启示和参考