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