【问题标题】:Go golang, syntax error: unexpected ++, expecting :Go golang,语法错误:意外++,期待:
【发布时间】:2014-09-12 03:24:33
【问题描述】:
  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++ 放在 slice 的索引中?切片索引有限制吗?

【问题讨论】:

    标签: syntax go


    【解决方案1】:

    Go Frequently Asked Questions (FAQ)

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

    没有指针运算,前后缀的方便值 增量运算符下降。通过从表达式中删除它们 层次结构,表达式语法被简化,杂乱无章 关于 ++ 和 -- 的评估顺序的问题(考虑 f(i++) 和 p[i] = q[++i]) 也被消除。简化是 重大。至于后缀与前缀,两者都可以正常工作,但 postfix 版本更传统;对前缀的坚持产生于 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.你可以用i++就好了,不需要i += 1。 2. 对于这个特定的代码,绝对不需要使用“i”。 play.golang.org/p/6h1kMGl8xe
    • ++ 如果像这样使用不会增加任何好处:/
    • golang 的最佳设计决策之一。
    • @ShashankV 你一定是 Python 爱好者和 C++ 憎恨者。 :D
    【解决方案2】:

    根据Language Specification,http://golang.org/ref/spec#IncDec_statements,i++是IncDec statements,是statement,但不是expression。至于args[index],索引必须是expression。如果您想了解更多详细信息,请阅读 Go 语言规范,这正是语言的要求。

    【讨论】:

      【解决方案3】:

      正如其他人所说,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)
      }
      

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

      【讨论】:

      • 说得好 - 没想到要那样尝试
      【解决方案4】:

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

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

      【讨论】:

      • 您必须在 inc 函数中返回 *i (int) 而不是 i (*int)
      • 您能解释一下为什么令人失望吗?
      猜你喜欢
      • 1970-01-01
      • 2017-09-12
      • 2019-12-06
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 2013-11-11
      相关资源
      最近更新 更多