2011-09-08 6 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で素晴らしいプレーができる方法を理解していませんが。

私は新しい行があった場合たとえば、:

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

と生活のすべてが良いでしょう:diffのショー

confuzzabler int // doo doo be doo 

をして差分を実行し、私はこれを取得する必要がありますが変更された唯一の行。私はこの得た私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出力が1行だけ変更されたためです。

Goデベロッパーとしてこれをどう対処しますか?

+2

は、ここでは「offtopic」をお読みくださいSOよくある質問と投票します: http://stackoverflow.com/faq明確SOプログラミングに関する質問をする「適切な場所」[原文のまま]であると述べて ツール(私は最近、私が最近ツールをdownvotedについての質問を持っていると誰かがそれを閉じるために投票...私の質問を投稿する他のどこに示唆せずにこれを述べなければならない)。 – SyntaxT3rr0r

+0

これは主に、ソースコードが実際に全く同じGoプログラムであることを理解するにはあまりにも愚かな* diff *ツールの欠点を主に強調していますが、私はこの* gofmt *の問題をどう扱うべきかを知りたいと思っています。 – SyntaxT3rr0r

+1

@Jonathan Leffler:私の質問を丁寧に読んでいただければ、それは**正確に**私が説明している問題であることがわかります。 * gofmt *の性質のために、ソースコードを簡単に変更すると、1行だけを変更したとしても、* gofmt *はいくつかの行を変更することができます。あなたが追加したものだけ)。これは、「何のためのものでもない」diffを生成するため、一般的に開発者のナットを推進するものです。ここで何人いるのかを見てみましょう。これは、「diffがうまくいけないので」というgofmt *のようなアライメントをしている人たちに不満を寄せています。 – SyntaxT3rr0r

答えて

0

diff出力を比較すると、何が起こったのかは明らかです。それは混乱も誤解もないものではありません。あなたには、いくつかの確立慣習次のコードを自分でフォーマットした場合

VCSの問題に関しては
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. 

、あなたはそのコードブロックに正確な方法で空白を再フォーマットし、手動で必要があるだろう(のはgofmtは、以下のものを、この大会があり、ここで想定してみましょう) gofmtでしたが、この変更はVCSによって変更としてカウントされていました。だから、私はこの場合セマンティクスには何の問題も見ません。代わりに、VCSによって提供されるdiffingツールについて気にするならば、おそらく上記のGNU diffと同様に空白の変更を無視してサポートするかどうかを調べるべきでしょう。 FWIW git diffは、同じ-bコマンドラインオプションでこれをサポートしています。

+1

+1しかし... * a = "kostix" *を文字列a = "kostix" *に変更するとどうなりますか?(末尾にスペースが1つから2つあることに気づく) * diff -b *は、有意義なスペースと意味のないスペースとの違いを理解するほどには賢明ではありません。だから実際-1。 ) – SyntaxT3rr0r

+0

あなたが手にしている問題よりもクリックに心配しているように見えます。 – kostix

5

あなたのゴーベースのプロジェクトの基準は何かを指示する必要があります任意の囲碁コードがVCSにコミットする前に

を、それがgofmtでフォーマットされています。唯一の許容される形式です。

次に引数はありません。コードが変更されずにgofmtを通過すると、すべて正常です。 gofmtを通過したときに変更された場合は、gofmtの出力を使用します。編集中は、他のコーディング標準の影響を受けますが、これはVCSにチェックインされたコードの要件です。

1

これがの場合、実際にはの場合、2つのチェックインを行います。

最初のチェックインはconfuzzablerです。合理的なコメントは「新しい変数をTに追加する」です。 あなたの差分は実際に変更したコードに分離されます。

次に、gofmtを実行します。

2回目のコミットは変更を書式設定するだけで、合理的なコミットメッセージは "gofmt"になります。 diffはgofmtが変更されたコードだけです。この前

関連する問題