Syn*_*r0r 5 version-control diff go
我有一个关于Go的gofmt工具的问题,它根据官方的Go规范自动格式化程序的输出(例如,你不能争论在Go中括号应该去哪里,因为这显然是由规范修复的).
在下一页:
http://golang.org/doc/effective_go.html
Run Code Online (Sandbox Code Playgroud)
在"格式化"段落下,写道:
例如,没有必要花时间排列结构字段的注释.Gofmt会为您做到这一点.鉴于声明
type T struct {
name string // name of the object
value int // its value
}
Run Code Online (Sandbox Code Playgroud)
gofmt将排列列:
type T struct {
name string // name of the object
value int // its value
}
Run Code Online (Sandbox Code Playgroud)
但是我不明白这对于diff和VCSes 有多好.
例如,如果我有一个新行:
confuzzabler int // doo doo be doo
Run Code Online (Sandbox Code Playgroud)
并运行差异,我应该得到这个:
2d1
< confuzzabler int // doo doo be doo
7d5
<
Run Code Online (Sandbox Code Playgroud)
生活将是美好的:差异显示唯一的变化线.
但是,如果我重新运行gofmt,我得到了这个:
type T struct {
confuzzabler int // doo doo be doo
name string // name of the object
value int // its value
}
Run Code Online (Sandbox Code Playgroud)
现在我重新运行差异,我得到了这个:
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
<
Run Code Online (Sandbox Code Playgroud)
这是一个高度混乱和误导性的差异输出,因为只有一行改变了.
作为Go开发人员,您如何处理这个问题?
$ 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.
Run Code Online (Sandbox Code Playgroud)
至于VCS的问题,如果你按照一些既定的约定自己格式化代码(让我们假设这个约定在gofmt下面),你已经手动重新格式化了该代码块中的空格,就像这样gofmt做了,这个改变就是被任何VCS视为变更.所以在这种情况下我没有看到任何语义问题,真的.如果您反而关心VCSes提供的差异工具,您应该看看它们是否支持忽略空白更改,就像上面提到的GNU diff那样.FWIW git diff使用相同的-b命令行选项支持此功能.
您的Go-based项目标准应该规定如下:
在将任何Go代码提交给VCS之前,将其格式化为
gofmt.这是唯一可接受的格式.
然后没有争论; 如果代码通过gofmt不变,一切都很好.如果它在传递时改变gofmt,则使用来自的输出gofmt.编辑时您所做的事情取决于您(取决于其他编码标准),但这是检入VCS的任何代码的要求.