Go 鲜为人知的角落|第 1 章 代码格式化|《Darker Corners of Go》独译(已授权)

392 阅读3分钟

当前译本仍不稳定,如翻译有问题请及时联系 jacob953@csu.edu.cn

gofmt

Go 大部分代码的格式化都是由 gofmt 工具强制执行的。gofmt 可以对源文件进行自动修改,例如,对导入的声明进行排序和对代码应用缩进等。 这是自切片面包以来最好的东西,因为它让开发人员不必再去争论这些无关紧要的事情。例如,使用制表符进行缩进,使用空格进行对齐,对代码风格的争论便到此为止。

你完全可以不使用 gofmt 工具,但如果你真的使用它,你就不能把它配置成一种特定的格式化风格。该工具完全没有提供任何代码格式化的选项,而这正是重点所在—— 提供一种统一的、“足够好”的格式化风格。这可能没有人喜欢的风格,但 Go 的开发者最终决定 统一胜于完美

统一风格和自动格式化代码有很多好处,包括但不限于:

  • 在代码审查中,你不需要花时间在格式化问题上;
  • 你不需要再与强迫症的同事去争论,开头的大括号应该放在哪里,或者应该用什么来做缩进。你的所有热情和精力都可以更有意义的地方。
  • 代码更容易写:你不需要担心代码的格式化细节。
  • 代码更容易读:你不需要在去适应不熟悉的代码风格。

大多数流行的 IDE 都有 Go 的插件,会在保存源文件时自动运行 gofmt。

如果必要,你可以使用诸如 goformat 此类第三方工具自定义 Go 的代码风格。

长行代码

gofmt 不会尝试分解长行代码,但你可以利用有诸如 golines 等第三方工具做到这一点。(一行代码不建议超过 200 个字母)

正括号

在 Go 中,正括号必须放在行尾。有趣的是,这并不是由gofmt强制执行的,而是Go词法分析器实现方式的副作用。 不管有没有 gofmt,正括号都不能放在新的一行上:

package main

// 缺少函数体
func main()
// 语法错误:不期望分号或换行在 { 前。
{
}

// 没毛病!
func main() {
}

多行声明中的逗号

在 Go 中,初始化 Slice, Array, Map 或结构体时,要在新的一行之前使用逗号。实际上,许多语言都允许使用尾部逗号,一些代码风格指南也鼓励这样使用。 但在 Go 中,它们是强制性的。这样,就可以在不修改无关代码行的情况下,重新排列行或添加新行。这也意味着在代码审查的差异中,可以减少干扰。

// 这些都是可以的
a := []int{1, 2}
b := []int{1, 2,}

c := []int{
    1,
    2}
d := []int{
    1,
    2,
}
// 语法错误,没有尾部逗号
e := []int{
    1,
    // 语法错误:不期望换行,期望是 , 或 }
    2
}

结构体也是如此:

type s struct {
    One int
    Two int
}
f := s{
    One: 1,
    // 语法错误:不期望换行,期望是 , 或 }
    Two: 2
}