Go 博客
go fmt 你的代码
引言
Gofmt 是一个自动格式化 Go 源代码的工具。
经 Gofmt 格式化后的代码
-
更易于 编写:编码时无需担心细微的格式问题,
-
更易于 阅读:当所有代码看起来都一样时,你无需在脑海中将他人的格式风格转换成你能理解的样子。
-
更易于 维护:对源代码进行机械化修改不会导致文件格式发生不相关的变化;差异(diffs)仅显示实际的修改。
-
无争议:再也不用为缩进或大括号的位置争论不休了!
格式化你的代码
我们最近对社区中的 Go 包进行了一项调查,发现其中约 70% 的包是按照 gofmt 的规则进行格式化的。这比预期的要多——感谢所有使用 gofmt 的人——但如果能缩小这个差距就太好了。
要格式化你的代码,你可以直接使用 gofmt 工具
gofmt -w yourcode.go
或者你可以使用 “go fmt” 命令
go fmt path/to/your/package
为了帮助你的代码保持规范风格,Go 仓库包含了适用于编辑器和版本控制系统的钩子(hooks),可以轻松地在你的代码上运行 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 用户,GoClipse 和 GoSublime 项目为这些编辑器添加了 gofmt 功能。
对于 Git 爱好者,misc/git/pre-commit 脚本 是一个 pre-commit 钩子,可以防止提交格式不正确的 Go 代码。如果你使用 Mercurial,hgstyle 插件 提供了一个 gofmt pre-commit 钩子。
机械化源代码转换
机器格式化代码的最大优点之一是它可以进行机械化转换,而不会在差异(diffs)中产生不相关的格式噪音。在处理大型代码库时,机械化转换非常宝贵,因为它比手动进行大范围修改更全面且不易出错。实际上,在规模化工作时(就像我们在 Google 所做的那样),手动进行这些类型的更改通常是不切实际的。
机械化操作 Go 代码最简单的方法是使用 gofmt 的 -r 标志。该标志指定了以下形式的重写规则
pattern -> replacement
其中 pattern 和 replacement 都是有效的 Go 表达式。在 pattern 中,单字符小写标识符用作通配符,匹配任意子表达式,并且这些子表达式在 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 的更多信息,请参阅这篇文章。
下一篇文章:Go maps 实战
上一篇文章:并发不是并行
博客索引