Go golang, синтаксическая ошибка: неожиданный ++, ожидающий:

  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 :

почему я не могу поставить я ++ в индекс среза? есть ли ограничение в индексе среза?

Ответ 1

Часто задаваемые вопросы (FAQ)

Почему ++ и - операторы, а не выражения? И почему postfix, не префикс?

Без арифметики указателя, удобное значение pre- и postfix приращение операторов падает. Удалив их из выражения иерархия вообще, синтаксис выражений упрощается и беспорядочный вопросы вокруг порядка оценки ++ и - (рассмотрим f (i ++) и p [i] = q [++ i]) также устранены. Упрощение значительное. Что касается постфикса и префикса, то все будет нормально работать, но постфиксная версия более традиционная; настаивание на префиксе возникло с STL, библиотека для языка, имя которого содержит, по иронии судьбы, postfix increment.

Спецификация языка программирования Go

Отчеты IncDec

Операторы "++" и "-" увеличивают или уменьшают свои операнды на нетипизированная константа 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]
}

Ответ 2

В соответствии с Спецификацией языка http://golang.org/ref/spec#IncDec_statements я ++ является IncDec statements, который является statement, но не expression.As для args[index], индекс должен быть expression. Вы хотите получить более подробную информацию, просто прочитайте инструкцию Go Language Specification, это именно то, что требует язык.

Ответ 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

++ оператор разочаровывает. Это мой хак

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