go golang,语法错误:意外++,期待:

Har*_*son 35 syntax go

  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
Run Code Online (Sandbox Code Playgroud)

编译后,我收到错误信息

    ./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 :
Run Code Online (Sandbox Code Playgroud)

为什么我不能把i ++放在切片索引中?切片指数有任何限制吗?

pet*_*rSO 41

Go常见问题(FAQ)

为什么++和 - 语句而不是表达式?为什么postfix,不是前缀?

如果没有指针运算,前后增量运算符的便利值就会下降.通过从表达层次共,表达式语法被简化并且围绕++和评价的顺序删除它们的杂乱的问题 - (考虑F(1 ++)和p [I] = Q [++ I])被消除,以及.简化很重要.至于后缀与前缀,要么工作正常,但后缀版本更传统; 坚持使用STL,这是一个语言库,其名称包含一个后缀增量.

Go编程语言规范

IncDec声明

"++"和" - "语句通过无类型常量1递增或递减其操作数.与赋值一样,操作数必须是可寻址的或映射索引表达式.

IncDecStmt = Expression ( "++" | "--" ) .
Run Code Online (Sandbox Code Playgroud)

以下赋值语句在语义上等效:

IncDec statement    Assignment
x++                 x += 1
x--                 x -= 1
Run Code Online (Sandbox Code Playgroud)

写,

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]
}
Run Code Online (Sandbox Code Playgroud)

在您的特定情况下,简化为,

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]
}
Run Code Online (Sandbox Code Playgroud)

  • 1.你可以使用`i ++`就好了,不需要`i + = 1`.2.对于这个特定的代码,绝对不需要使用"i".http://play.golang.org/p/6h1kMGl8xe (3认同)
  • 如果这样使用,++不会增加任何好处:/ (3认同)

fra*_*lin 16

根据语言规范,http://golang.org/ref/spec#IncDec_statements,i ++是a IncDec statements,它是a statement,但不是a expression.因为args[index]索引必须是a expression.你想要更多细节,只需阅读它Go Language Specification,它就是语言需求.


And*_*ewN 12

正如其他人所说的那样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)
}
Run Code Online (Sandbox Code Playgroud)

你的定义map也会在运行时失败.


Sch*_*999 6

++运营商令人失望。这是我的黑客:

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)]
  }
Run Code Online (Sandbox Code Playgroud)

  • inc 函数中必须返回 *i (int) 而不是 i (*int) (2认同)