2014-09-12 27 views
9
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 

derleme sonra, ben dilimin endeksinde ++Git golang, sözdizimi hatası: beklenmeyen ++, bekliyor:

./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 : 

neden koyamazsınız hata mesajı alıyorum? dilim indeksinde herhangi bir sınırlama var mı?

cevap

15

Go Frequently Asked Questions (FAQ)

Why are ++ and -- statements and not expressions? And why postfix, not prefix?

Without pointer arithmetic, the convenience value of pre- and postfix increment operators drops. By removing them from the expression hierarchy altogether, expression syntax is simplified and the messy issues around order of evaluation of ++ and -- (consider f(i++) and p[i] = q[++i]) are eliminated as well. The simplification is significant. As for postfix vs. prefix, either would work fine but the postfix version is more traditional; insistence on prefix arose with the STL, a library for a language whose name contains, ironically, a postfix increment.

The Go Programming Language Specification

IncDec statements

The "++" and "--" statements increment or decrement their operands by the untyped constant 1. As with an assignment, the operand must be addressable or a map index expression.

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

The following assignment statements are semantically equivalent:

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

Yaz,

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] 
} 
hangisi sizin özel durumda, basitlenerek

,

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] 
} 
+3

1. Sadece i ++ 'i kullanabilirsiniz, sadece i + = 1' e gerek yoktur. 2. Bu özel kod için mutlak "i" kullanmanıza gerek yoktur. http://play.golang.org/p/6h1kMGl8xe – OneOfOne

+0

Teşekkürler, anlayın. – HardySimpson

9

Dil Şartname, http://golang.org/ref/spec#IncDec_statements göre, i ++ bir statement bir IncDec statements, ama değil expression .as args[index] için, endeks bir expression olmalıdır. Daha fazla ayrıntı istersiniz, sadece Oku Dili Spesifikasyonu'nu okuyun, sadece dilin talebi.

5

kişi i++ seferde bir açıklama değil, bunun gibi bir ifadesidir söylediğimiz gibi C.'de birden fazla ödevi kullanarak aynı amacı ifade etmenin farklı bir yolu vardır:

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 tanımınız da çalışma zamanında başarısız olmuş olabilir.

+0

Güzel koydu - bu şekilde denemeyi düşünmedim – notzippy

İlgili konular