我有一个关于Go的 gofmt 工具的问题,该工具根据官方的Go规范自动格式化程序的输出(例如,你不能争论在Go中括号应该去哪里,因为那是显然是由规格确定的。)
在下一页:
http://golang.org/doc/effective_go.html
在“格式化”段落下,写着:
作为一个例子,没有必要花时间排列评论 结构的领域。 Gofmt会为您做到这一点。鉴于 声明
type T struct {
name string // name of the object
value int // its value
}
gofmt将排列列:
type T struct {
name string // name of the object
value int // its value
}
但是我不明白这对于 diff 和VCSes有什么用。
例如,如果我有一个新行:
confuzzabler int // doo doo be doo
并运行 diff ,我应该得到这个:
2d1
< confuzzabler int // doo doo be doo
7d5
<
生活将是美好的:差异显示唯一的变化线。
但是,如果我重新运行 gofmt ,我得到了这个:
type T struct {
confuzzabler int // doo doo be doo
name string // name of the object
value int // its value
}
现在我重新运行差异,我得到了这个:
2,4c2,3
< confuzzabler int // doo doo be doo
< name string // name of the object
< value int // its value
---
> name string // name of the object
> value int // its value
7d5
<
这是一个高度混乱和误导性的 diff 输出,因为只有一行更改。
作为Go开发人员,您如何处理这个问题?
答案 0 :(得分:5)
$ diff --help|grep -i white
-b --ignore-space-change Ignore changes in the amount of white space.
-w --ignore-all-space Ignore all white space.
关于VCS的问题,如果你是按照一些已建立的约定自己格式化代码(让我们假设这个约定是gofmt
所遵循的那个)你必须手动重新格式化该代码块中的空格。 gofmt
做了,并且任何VCS都会将此更改视为更改。所以在这种情况下我没有看到任何语义问题,真的。如果您反而关心VCSes提供的差异工具,您应该看看它们是否支持忽略空白更改,就像上面提到的GNU diff那样。 FWIW git diff
使用相同的-b
命令行选项支持此功能。
答案 1 :(得分:5)
您的Go项目标准应该规定如下:
在将任何Go代码提交给VCS之前,它的格式为
gofmt
。这是唯一可接受的格式。
然后没有争论;如果代码通过gofmt
不变,一切都很好。如果在通过gofmt
时更改,则使用gofmt
的输出。您在编辑时所做的事情取决于您(取决于其他编码标准),但这是检入VCS的任何代码的要求。
答案 2 :(得分:1)
如果真的困扰你,请做两次登记。
首次登记会添加confuzzabler
。合理的评论是“向T添加新变量”。
您的差异将与您实际更改的代码隔离开来。
然后,执行gofmt。
第二次提交只是格式化更改,合理的提交msg将是“gofmt”。这里的差异只是gofmt已经改变的代码。
答案 3 :(得分:0)
比较差异输出,很明显发生了什么。它既不会混淆也不会产生误导。