web-dev-qa-db-ja.com

Go Golang、構文エラー:予期しない++、期待:

  func test(args ...string) {
    var msg map[string] interface{}

    i := 0
    msg["product"] = args[i++]
    msg["key"] = args[i++]
    msg["signature"] = args[i++]
    msg["string_to_sign"] = args[i++]
  }

  go build utils.go

コンパイル後、エラーメッセージが表示されます

    ./utils.go:28: syntax error: unexpected ++, expecting :
    ./utils.go:28: missing statement after label
    ./utils.go:29: syntax error: unexpected ++, expecting :
    ./utils.go:30: syntax error: unexpected ++, expecting :
    ./utils.go:31: syntax error: unexpected ++, expecting :
    ./utils.go:36: syntax error: unexpected ++, expecting :
    ./utils.go:37: syntax error: unexpected ++, expecting :

スライスのインデックスにi ++を入れられないのはなぜですか?スライスのインデックスに制限はありますか?

31
HardySimpson

よくある質問(FAQ)に進む

なぜ++および-ステートメントであり、式ではないのですか?そして、なぜ接頭辞ではなく接尾辞ですか?

ポインター演算がないと、前置および後置インクリメント演算子の便利な値が低下します。それらを式階層から完全に削除することにより、式の構文が単純化され、++および f(i ++)およびp [i] = q [++ i]を考慮)の評価順序に関する厄介な問題も同様に排除されます。 。簡素化は重要です。接尾辞と接頭辞については、どちらでも問題ありませんが、接尾辞のバージョンはより伝統的です。接頭辞の主張は、皮肉なことに、接尾辞の増分を含む名前の言語のライブラリであるSTLで生じました。

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

IncDecステートメント

「++」および「-」ステートメントは、型なし定数1によってオペランドをインクリメントまたはデクリメントします。割り当てと同様に、オペランドはアドレス可能またはマップインデックス式でなければなりません。

IncDecStmt = Expression ( "++" | "--" ) .

次の割り当てステートメントは、意味的に同等です。

IncDec statement    Assignment
x++                 x += 1
x--                 x -= 1

書きます、

func test(args ...string) {
    var msg map[string]interface{}
    i := 0
    msg["product"] = args[i]
    i++
    msg["key"] = args[i]
    i++
    msg["signature"] = args[i]
    i++
    msg["string_to_sign"] = args[i]
}

あなたの特定の場合、これは単純化され、

func test(args ...string) {
    var msg map[string]interface{}
    msg["product"] = args[0]
    msg["key"] = args[1]
    msg["signature"] = args[2]
    msg["string_to_sign"] = args[3]
}
40
peterSO

言語仕様によると http://golang.org/ref/spec#IncDec_statements 、i ++はIncDec statements、これはstatementですが、expressionではありません。args[index]、インデックスはexpressionでなければなりません。さらに詳細が必要な場合は、Go Language Specificationを読んでください。まさに言語が要求するものです。

14
frank.lin

他の人が言ったようにi++はgoのステートメントであり、Cのような式ではありません。Goには、複数の代入を使用して同じ意図を表現する異なる方法があります。

func test(args ...string) {
    msg := make(map[string]string)
    i := 0

    msg["product"], i = args[i], i+1
    msg["key"], i = args[i], i+1
    msg["signature"], i = args[i], i+1
    msg["string_to_sign"], i = args[i], i+1

    fmt.Printf("%v\n", msg)
}

mapの定義も実行時に失敗します。

11
AndrewN

++演算子は残念です。これは私のハックです:

func test(args ...string) {
    i := 0
    inc := func(i *int) int { *i++; return i }
    var msg map[string] interface{}

    msg["product"] = args[inc(&i)]
    msg["key"] = args[inc(&i)]
    msg["signature"] = args[inc(&i)]
    msg["string_to_sign"] = args[inc(&i)]
  }
1
Schultz9999