35

Go Web サーバーの例: http://golang.org/doc/effective_go.html#web_server

次のコード行が機能します

var addr = flag.String("addr", ":1718", "http service address")

しかし、それを

addr := flag.String("addr", ":1718", "http service address")

コンパイルエラーです。なんで?*string関数の戻り値の型がではなく であるという顔と何か関係がありstringますか? それはどのような違いをもたらしますか?

更新:=:トップレベルでは許可されていないことを指摘していただきありがとうございます。この矛盾が仕様にある理由は何ですか? ブロック内で動作が異なる理由はわかりません。

4

3 に答える 3

32

Go では、最上位の変数割り当てにはキーワードを前に付ける必要があります。varキーワードの省略は、varブロック内でのみ許可されます。

package main

var toplevel = "Hello world"         // var keyword is required

func F() {
        withinBlock := "Hello world" // var keyword is not required
}
于 2014-02-09T09:49:04.167 に答える
21

更新された質問について:実際には、長い宣言と短い宣言には違いがあり、その短い形式では変数の再宣言が可能です。

スペックから:

通常の変数宣言とは異なり、短い変数宣言では、同じブロック内で同じ型で最初に宣言されていて、空白以外の変数の少なくとも 1 つが新しい場合、変数を再宣言できます。結果として、再宣言は複数変数の短い宣言でのみ使用できます。再宣言は新しい変数を導入しません。元の値に新しい値を割り当てるだけです。

field1, offset := nextField(str, 0)
field2, offset := nextField(str, offset)  // redeclares offset
a, a := 1, 2                              // illegal: double declaration of a or no new variable if a was declared elsewhere

:=したがって、演算子は純粋なdeclareではなく、declare と assign に似ていると言えます。トップレベルでの再宣言は許可されていないため、短い宣言も許可されていません。

これのもう 1 つの理由は、構文の単純さかもしれません。typeGo では、すべてのトップレベル フォームは,varまたはで始まりますfunc。短い宣言はすべての可愛さを台無しにします.

于 2014-02-09T13:28:06.727 に答える
10

Go プログラミング言語仕様

短い変数宣言

短い変数宣言では、次の構文を使用します。

ShortVarDecl = IdentifierList ":=" ExpressionList .

短い変数宣言は、関数内でのみ使用できます。

あなたの例では、関数本体の外側で変数宣言ステートメントを変更しています

var addr = flag.String("addr", ":1718", "http service address")

関数本体の外側の短い変数宣言ステートメントに

addr := flag.String("addr", ":1718", "http service address")

コンパイラ エラー「関数本体外の非宣言ステートメント」で失敗します。

于 2014-02-09T10:22:39.727 に答える