可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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
after compile, I get the error message
./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 :
why can't I put i++ in index of slice? is there any limitation in index of slice?
回答1:
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] }
Which, in your particular case, simplifies to,
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] }
回答2:
According to Language Specification, http://golang.org/ref/spec#IncDec_statements, i++ is a IncDec statements, which is a statement, but not a expression.As for args[index], index must be a expression. You want more details , just read it Go Language Specification, it's just what the language demand.
回答3:
As other people have said i++ is a statement in go, not an expression as it is in C. Go has a different way of expressing the same intent using multiple assignment:
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) }
Your definition of map would have failed at runtime too.