Go golang, syntax error: unexpected ++, expecting :

匿名 (未验证) 提交于 2019-12-03 02:56:01

问题:

  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.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!