Go 博客
go fmt your code
介绍
Gofmt 是一款自动格式化 Go 源代码的工具。
经过 Gofmt 格式化的代码
-
更易于编写:在编写代码时无需担心次要的格式问题,
-
更易于阅读:当所有代码都采用相同的格式时,您无需在脑海中将其他人的格式风格转换为您可以理解的风格。
-
更易于维护:对源代码的机械更改不会导致与文件格式无关的更改;差异仅显示实际更改。
-
无争议:永远不要再就空格或大括号位置进行争论!
格式化您的代码
我们最近对现实环境中的 Go 包进行了调查,发现大约 70% 的包都根据 gofmt 的规则进行了格式化。这超出了预期——并感谢所有使用 gofmt 的人——但缩小差距将是一件很棒的事情。
要格式化您的代码,您可以直接使用 gofmt 工具
gofmt -w yourcode.go
或者您可以使用“go fmt”命令
go fmt path/to/your/package
为了帮助您保持代码的规范样式,Go 存储库包含编辑器和版本控制系统的钩子,使您可以轻松地在代码上运行 gofmt。
对于 Vim 用户,Vim 的 Go 插件 包含 :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 脚本 是一个预提交钩子,可以防止格式错误的 Go 代码被提交。如果您使用 Mercurial,hgstyle 插件 提供了一个 gofmt 预提交钩子。
机械源代码转换
机器格式化代码的最大优点之一是,它可以被机械地转换,而不会在差异中生成无关的格式噪音。在处理大型代码库时,机械转换非常宝贵,因为它比手动进行大规模更改更全面且更不容易出错。实际上,当以大规模(例如我们在 Google 中所做的那样)进行操作时,手动进行此类更改通常是不切实际的。
机械操作 Go 代码最简单的方法是使用 gofmt 的 -r 标记。该标记指定了一个形式为 的重写规则
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 类型。当我们引入 error 时,我们提供了一个 gofix 模块,该模块将所有对 os.Error 及其相关辅助函数的引用重写为使用 error 和新的 errors 包。手动尝试将是一项艰巨的任务,但是当代码采用标准格式时,准备、执行和审查此更改相对容易,此更改几乎影响了所有现有的 Go 代码。
有关 gofix 的更多信息,请参阅本文。