本文翻译自《go fmt your code》。
Andrew Gerrand 2013/01/23
介绍
Gofmt是一个用来自动格式化Go源代码的工具。
Gofmt的代码:
- 更易于编写:在编写时永远不要担心小的格式问题,
- 更容易阅读:当所有代码看起来都一样时,你不需要在心里把别人的格式风格转换成你能理解的东西。
- 更易于维护:对源码的细节更改不会导致对文件格式的不相关更改;diffs(差异)只显示真正的变化。
- 无争议:永远不会再争论空格或括号位置这些问题了!
格式化你的代码
我们最近对野外(非官方)的Go软件包进行了一项调查,发现大约70%的软件包是根据gofmt规则格式化的。这比预期的要多,感谢所有使用gofmt的人,但如果能继续缩小差距就太好了。
要格式化Go代码,可以直接使用gofmt工具:
gofmt -w yourcode.go
或者你也可以使用“go fmt”命令:
go fmt path/to/your/package
为了帮助你保持代码的风格规范,Go存储库包含编辑器和版本控制系统的钩子,使你可以轻松地在代码上运行gofmt。
对于Vim用户,Go的Vim插件包含了在当前缓冲区上运行gofmt的Fmt命令。
对于emacs用户,go-mode.el提供了一个保存前执行gofmt的钩子,可以通过将此行添加到.emacs文件来安装:
(add-hook 'before-save-hook #'gofmt-before-save)
对于Eclipse或SublimeText用户,GoClipse和GoSublime项目为这些编辑器添加了一个gofmt功能。
对于Git爱好者来说,misc/Git/precommit脚本是一个commit之前的钩子,可以防止提交格式错误的Go代码。如果你使用Mercurial,hgstyle插件提供了一个gofmt预提交钩子。
机器修改源代码
使用机器格式化代码最大的优点之一是可以机械地转换代码格式,而不会产生与格式化无关的东西。当你使用的代码库很庞大时,机械转换是无价的,因为它比手工进行大范围的更改更加全面,也更不容易出错。事实上,当工作规模很大时(就像我们在谷歌所做的那样),手动进行代码更改通常是不现实的。
使用机器操作Go代码的最简单方法是使用gofmt命令的-r
标志。标志指定代码格式的重写规则:
pattern -> replacement
其中模式(pattern)和替换(replacement)都是有效的Go表达式。在该模式中,单字符小写标识符用作匹配任意子表达式的通配符,并且这些表达式在replacement
中被替换为相同的标识符。
例如,最近对Go核心的更改重写了对bytes.Compare
方法的一些使用,以改为使用更高效bytes.Equal
方法。仅仅使用两个gofmt命令就修改成功:
gofmt -r 'bytes.Compare(a, b) == 0 -> bytes.Equal(a, b)'
gofmt -r 'bytes.Compare(a, b) != 0 -> !bytes.Equal(a, b)'
Gofmt还使用了gofix,它可以进行任意复杂的源代码转换。在早期,当我们经常对语言和库进行破坏性的更改时,Gofix是一个非常宝贵的工具。例如,在Go 1之前,内置的error
接口还不存在,约定是使用os.Error
类型。当我们引入error
接口时,我们提供了一个gofix模块,它重写了对os.Error
及其相关助手函数的所有引用,以使用error
接口和新的errors
包。尝试手工更改代码可能会让人望而却步,但有了标准格式的代码,准备、执行和审查这一变化就相对容易,这几乎涉及到了现有的所有Go代码。
有关gofix的更多信息,请参阅本文。