Syntax Go golang,语法错误:意外++;,期望:

Syntax Go golang,语法错误:意外++;,期望:,syntax,go,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 为什么

编译之后,我得到了错误消息

  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

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

根据语言规范,i++是一个
IncDec语句
,它是
语句
,但不是
表达式
。至于
参数[index]
,索引必须是
表达式
。你想要更多的细节,只需阅读它的Go语言规范,这正是语言所需要的

没有指针算法,前缀和后缀的方便值 增量运算符将删除。通过从表达式中删除它们 总的来说,表达式语法被简化了,而且比较混乱 关于++和--(考虑f(i++)和 p[i]=q[++i])也被消除。简化是 重要的至于后缀和前缀,两者都可以,但是 后缀版本更传统;对前缀的坚持是随着时间的推移而产生的 具有讽刺意味的是,STL是一种语言的库,其名称包含 后缀增量

“++”和“--”语句将其操作数递增或递减 非类型化常量1。与赋值一样,操作数必须为 可寻址或映射索引表达式

    ./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 :
以下赋值语句在语义上是等价的:

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

正如其他人所说,
i++
是go中的一个语句,而不是C中的一个表达式。go使用多个赋值来表达相同意图的方式不同:

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

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

++
运算符令人失望。这是我的技巧:

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

1.您只需使用
i++
即可,无需
i+=1
。2.对于这个特定的代码,绝对不需要使用“i”。++如果这样使用的话,没有任何好处:GORANG的最佳设计决定之一。@ ShashankV,你必须是Python爱好者和C++仇恨者。DNicely put-没有想到要这样做,必须在inc函数中返回*i(int)而不是i(*int)
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)]
  }