我有一个关于Go的gofmt工具的问题,该工具会根据官方的Go规范自动格式化程序的输出(例如,您无法争论Go中的括号,因为这显然是由规范固定的)。

在下一页上:

http://golang.org/doc/effective_go.html

在“格式设置”段落下的内容是:


type T struct {
    name string // name of the object
    value int // its value
}


type T struct {
    name    string // name of the object
    value   int    // its value
}

但是我不明白如何在diff和VCSes下使用它。

例如,如果我有一个新行:
confuzzabler int // doo doo be doo

并运行差异,我应该得到这个:
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
}

现在,我重新运行diff,我得到了:
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
<

这是一个非常令人困惑和误导的差异输出,因为仅更改了一行。

作为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.

关于VCS的问题,如果您按照某种既定的约定自行格式化代码(假设此处约定是gofmt遵循的约定),则您将按照gofmt的方式手动重新格式化该代码块中的空格,此更改将任何VCS都将其视为更改。因此,在这种情况下,我确实看不到语义上的任何问题。如果相反,您关心的是VCS提供的差异化工具,您可能应该看一下它们是否确实像上述GNU差异一样支持忽略空格更改。 FWIW git diff确实使用相同的-b命令行选项支持此功能。

09-09 23:57
查看更多