Go的gofmt和diff / VCS问题?

时间:2011-09-08 13:08:54

标签: version-control diff go

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

4 个答案:

答案 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)

比较差异输出,很明显发生了什么。它既不会混淆也不会产生误导。