2015-01-13 3 views
17

は囲碁文献によれば(count := 0の形式で)2つの(var count = 0またはvar count intの形式で)変数なぜGoで変数を宣言するのか2つの方法がありますが、違いは何ですか?

Variable_declarationsを宣言する方法

Short_variable_declarations

がある私はそれが非常にだましたどちらを使うかを決めるのは混乱します。ときに、関数のスコープで

  • 私だけcount := 0形式を使用することができます

    (今まで)私が知っている違いがあることです。

  • count := 0でを再宣言したにすることができます。

しかし、彼らは私が知っている限りと同じ振る舞いをします。そしてそれはまた、says参照して:

それ(count:=0方法は)初期化子式との定期的な変数宣言のための速記ですが、何種類

私の混乱はありません:

  • もしも他のものの簡略な表現であれば、なぜ彼らは異なった振る舞いをしますか?
  • Goの作成者は、変数を宣言する2つの方法をどのように心配していますか(なぜ、それらは一方向にマージされません)?ちょうど私たちを混乱させる?
  • 私がピットに陥った場合に備えて、私が目を開いたままにしておくべき他の側面はありますか?

答えて

29

Variable declarationsは、変数が宣言されていることを明確にします。 varキーワードが必要とされ、それが短く、行われているものを表現する(コメントを除くファイル・レベルのすべてでは、キーワード、例えばpackageimportconsttypevarfuncで開始することがあります)。他のブロックと同じように、変数の宣言は次のように分類することができます。

var (
    count int 
    sum float64 
) 

あなたはShort variable declarationsでそれを行うことはできません。また、初期値を指定せずに変数宣言を使用することもできます。この場合、各変数の型の値はゼロになります。 Short変数の宣言ではこれが許されません。初期値を指定する必要があります。

Goの指針設計の原則の1つは、構文をきれいにすることでした。多くのステートメントは、forifswitchなどステートメント本体でのみ使用可能なローカル変数を宣言することができますが、便利です。構文をより洗練されたものにするために、ショート変数宣言は彼らが何をしているのかは分かりません。

for idx, value := range array { 
    // Do something with index and value 
} 

if num := runtime.NumCPU(); num > 1 { 
    fmt.Println("Multicore CPU, cores:", num) 
} 

もう一つの違い:再宣言

は、言語仕様から引用:通常の変数宣言とは異なり

、短い変数宣言は以前と同じで、彼らが最初に宣言された提供の変数を再宣言します同じタイプのブロックであり、非ブランク変数の少なくとも1つは新しいものです。結果として、再宣言は複数変数の短い宣言でしか現れません。再宣言は新しい変数を導入しません。オリジナルに新しい値を割り当てます。

これも便利です。最も可能性が高いだけ最後の関数呼び出し中にエラーがあったかどうかを確認するためにそれを必要とするので、あなたが適切なエラー処理をしたいと仮定し、あなたがerr変数を再利用することができます

var name = "myfile.txt" 

fi, err := os.Stat(name) // fi and err both first declared 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Println(name, fi.Size(), "bytes") 

data, err := ioutil.ReadFile(name) // data is new but err already exists 
            // so just a new value is assigned to err 
if err != nil { 
    log.Fatal(err) 
} 

// Do something with data 
+0

あまりにも速く、より詳細な私より。いい答え。 +1 –

+1

あなたの答えをありがとう、なぜ彼らは関数スコープの外で ':='形式を使うのが好きではないのですか?私はそれが有害かもしれないことがわかりません。 – armnotstrong

+3

@armnotstrongファイルレベルでは、すべてのコメント(コメントは除外されています)はキーワードで始まる必要があります。 'package'、' import'、 'const'、' type''var'、 'func'です。 – icza

関連する問題