2014-09-12 16 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 

po kompilacji, pojawia się komunikat o błędzieGo golang, błąd składni: niespodziewany ++, oczekując:

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

dlaczego nie mogę umieścić w indeksie i ++ wycinka? czy istnieje jakiekolwiek ograniczenie w indeksie plasterka?

Odpowiedz

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 

Write,

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

, które w danym przypadku, upraszcza się,

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. możesz po prostu użyć 'i ++' po prostu dobrze, bez potrzeby 'i + = 1'. 2. Dla tego konkretnego kodu nie ma absolutnie potrzeby używania "i". http://play.golang.org/p/6h1kMGl8xe – OneOfOne

+0

Dzięki, rozumiem. – HardySimpson

9

Według specyfikacji języka, http://golang.org/ref/spec#IncDec_statements, i ++ jest IncDec statements, który jest statement, ale nie expression .Jak dla args[index], indeks musi być expression. Chcesz więcej szczegółów, po prostu przeczytaj specyfikację Go Language, po prostu tego wymaga język.

5

Jak mówili inni i++ jest stwierdzenie w ruchu, a nie wyrazem jak to jest w C. Go ma inny sposób wyrażania tego samego celu za pomocą wielu zadań:

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) 
} 

Twoja definicja map również nie powiodłaby się w czasie wykonywania.

+0

Ładnie postawione - nie sądziłem, że spróbuję tego w ten sposób – notzippy

Powiązane problemy