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

时间:2014-09-12 03:24:34

标签: 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

编译后,我收到错误信息

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

为什么我不能把i ++放在切片索引中?切片的索引是否有任何限制?

4 个答案:

答案 0 :(得分:34)

  

Go Frequently Asked Questions (FAQ)

     

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

     

没有指针运算,前缀和后缀的便利值   增量运算符下降。通过从表达式中删除它们   层次结构一样,表达式语法简化而且凌乱   关于++和 - 的评估顺序的问题 - (考虑f(i ++)和   p [i] = q [++ i]也被消除。简化是   重大。至于后缀与前缀,要么可以正常工作,但是   后缀版本更传统;坚持使用前缀   STL,一个名称包含的语言的库,具有讽刺意味的是   后缀增量。

     

The Go Programming Language Specification

     

IncDec statements

     

“++”和“ - ”语句增加或减少其操作数   无类型常量1.与赋值一样,操作数必须为   可寻址或地图索引表达。

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

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

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

写入,

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

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

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

答案 1 :(得分:14)

根据语言规范http://golang.org/ref/spec#IncDec_statements,i ++是IncDec statementsstatement,而不是expression。至于args[index],索引必须是expression。您需要更多详细信息,只需阅读Go Language Specification,它就是语言需求。

答案 2 :(得分:11)

正如其他人所说i++是一个声明,而不是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)
}

您对map的定义也会在运行时失败。

答案 3 :(得分:0)

String j = "C://rafa.jpg". 运算符令人失望。这是我的技巧:

++