Go的gofmt和diff/VCS问题?

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开发人员,您如何处理这个问题?

kos*_*tix 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.
Run Code Online (Sandbox Code Playgroud)

至于VCS的问题,如果你按照一些既定的约定自己格式化代码(让我们假设这个约定在gofmt下面),你已经手动重新格式化了该代码块中的空格,就像这样gofmt做了,这个改变就是被任何VCS视为变更.所以在这种情况下我没有看到任何语义问题,真的.如果您反而关心VCSes提供的差异工具,您应该看看它们是否支持忽略空白更改,就像上面提到的GNU diff那样.FWIW git diff使用相同的-b命令行选项支持此功能.

  • +1但是...如果我做 *string a = "kostix "* 然后将其更改为 *string a = "kostix "* (注意末尾的额外空格,从一个空格到两个空格)。*diff -b* 还远远不够聪明,无法理解有意义的空间和无意义的空间之间的区别。所以实际上是 -1 ;) (2认同)

Jon*_*ler 5

您的Go-based项目标准应该规定如下:

在将任何Go代码提交给VCS之前,将其格式化为gofmt.这是唯一可接受的格式.

然后没有争论; 如果代码通过gofmt不变,一切都很好.如果它在传递时改变gofmt,则使用来自的输出gofmt.编辑时您所做的事情取决于您(取决于其他编码标准),但这是检入VCS的任何代码的要求.


pet*_*rSO 0

比较 diff 输出,很明显发生了什么。它既不令人困惑,也不具有误导性。