2011-09-08 110 views
5

我有一個關於Go的問題gofmt工具,根據官方的Go規格自動格式化程序的輸出(例如,你不能爭論括號應該在Go中的位置,因爲這顯然是由規格固定的) 。Go的gofmt和diff/VCS問題?

在接下來的頁面:

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 
} 

不過,我不明白這到底是怎麼可能發揮好與差異和VCSes。

舉例來說,如果我有一個新的生產線:

confuzzabler int // doo doo be doo 

和運行差異,我應該得到這樣的:

2d1 
<  confuzzabler int // doo doo be doo 
7d5 
< 

而且生活將是所有好:DIFF節目唯一的一條線被改變了。

但是,如果我重新運行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開發者?

+2

在此之前獲得票選爲「offtopic」請閱讀FAQ SO這裏: http://stackoverflow.com/faq 其中明確規定,所以是「正確的地方」 [原文]問有關編程的問題工具(我必須說明這一點,因爲最近我有一個關於工具downvoted的問題,有人投票結束它......當然沒有建議其他地方發佈我的問題)。 – SyntaxT3rr0r

+0

我意識到這主要是強調* diff *工具的缺點,它們太愚蠢了,理解這兩個源代碼實際上是完全一樣的Go程序,但我仍然有興趣知道應該如何處理這個* gofmt *問題。 – SyntaxT3rr0r

+1

@Jonathan Leffler:如果你仔細閱讀我的問題,你會發現那正是**我正在描述的問題。由於* gofmt *的性質,對源代碼進行微小的更改可以使* gofmt *更改幾行代碼,即使您只是更改了一行(因爲它正在重新對齊所有**行,而不是隻是你添加的那個)。這是典型的驅動開發者的堅果,因爲它產生了「無爲」的差異。只要看看這裏有多少人抱怨人們在做那種* gofmt *所做的對準,「因爲它彌補了差異」。 – SyntaxT3rr0r

回答

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計爲一項更改。所以在這種情況下,我真的沒有看到任何語義問題。如果你關心VCS提供的差異化工具,你應該看看他們是否支持忽略空白變化,就像上面提到的GNU diff一樣。 FWIW git diff確實支持這與相同的-b命令行選項。

+1

+1但是...如果我做了* string a =「kostix」*,然後將它改爲* string a =「kostix」*(注意最後的額外空間,從一個空間到兩個空間)。 * diff -b *遠不夠聰明,無法理解有意義的空間和無意義的空間之間的區別。所以-1實際上; ) – SyntaxT3rr0r

+0

看起來你更關心點擊問題,而不是手邊的問題。 – kostix

5

您的基於圍棋項目的標準應該規定是這樣的:

任何Go代碼致力於VCS之前,它的格式爲gofmt。這是唯一可接受的格式。

然後沒有任何爭論;如果代碼通過gofmt不變,則一切正常。如果通過gofmt時發生變化,則使用gofmt的輸出。您在編輯時所做的工作取決於您(受其他編碼標準的限制),但這是任何代碼簽入您的VCS的要求。

1

如果這個真的困擾你,做兩個簽入。

第一次登記入住時增加了confuzzabler。一個合理的評論是「向T添加新變量」。 您的差異將被隔離到您實際更改的代碼。

然後執行gofmt。

第二次提交只是格式化更改,合理的提交消息將是「gofmt」。這裏的差異將只是gofmt已經改變的代碼。