使用 go fmt 格式化代码

未匹配的标注

本文为官方 Go Blog 的中文翻译,详见 翻译说明

安德鲁·格朗德
2013年1月23日

介绍

Gofmt是自动格式化Go源代码的工具。

Gofmt的代码是:

-更容易编写:在编码时,不必担心次要的格式化问题,

-更易于阅读:当所有代码看起来都一样时,您无需在思维上将他人的格式转换为您可以理解的格式。

-易于维护:对源文件的机械更改不会导致文件格式的无关更改;差异仅显示实际更改。

-毫无争议:再也无需辩论间距或括号的位置!

格式化代码

我们最近对外界的Go软件包进行了一项调查,发现其中约70%是根据gofmt的规则格式化的。这超出了预期-并感谢使用gofmt的每个人-但缩小差距非常好。

要格式化代码,可以直接使用gofmt工具:

gofmt -w yourcode.go

或者,您可以使用“ go fmt”命令:

go fmt path/to/your/package

为了使代码保持规范性,Go仓库包含用于编辑器和版本控制系统的钩子,可轻松在代码上运行gofmt。

对于Vim用户,Go的Vim插件包括:Fmt命令,该命令在当前缓冲区上运行gofmt。

对于emacs用户,go-mode.el提供了gofmt-before-save钩子,可以通过将以下行添加到.emacs文件中来进行安装:

(add-hook 'before-save-hook #'gofmt-before-save)

对于Eclipse或Sublime Text用户,GoClipseGoSublime项目向这些编辑器添加了gofmt工具。

对于Git迷来说,misc/git/pre-commit脚本是一个-commit钩子,可防止提交格式错误的Go代码。如果您使用Mercurial,则hgstyle插件提供了gofmt预提交钩子。

机械源码转换

机器格式化代码的最大优点之一是,可以对其进行机械转换,而不会在差异中产生无关的格式化噪声。与大型代码库一起使用时,机械转换非常宝贵,因为与手动进行广泛更改相比,机械转换不仅更全面,而且更不容易出错。确实,当进行大规模工作时(例如我们在Google所做的工作),手动进行此类更改通常是不切实际的。

机械地操纵Go代码的最简单方法是使用gofmt的-r标志。该标志使用如下格式指定了重写规则

pattern -> replacement

pattern和replacement都是有效的Go表达式。在此模式中,单字符小写标识符用作匹配任意子表达式的通配符,并且这些表达式将替换为相同的标识符。

例如,对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之前,内置的错误接口不存在,约定使用os.Error类型。当我们引入错误时,我们提供了一个gofix模块,该模块重写了对os.Error及其相关辅助函数的所有引用,以使用error和新的errors包。手工尝试可能会很艰巨,但是使用标准格式的代码,相对容易编写、执行和查看这种更改,因为它几乎触及了所有当时存在Go代码。

有关gofix的更多信息,请参见本文

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/go-blog/go-fmt-...

译文地址:https://learnku.com/docs/go-blog/go-fmt-...

上一篇 下一篇
Summer
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~