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
après la compilation, j'obtiens le message d'erreur
./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 :
pourquoi ne puis-je pas mettre i ++ dans l'index de tranche? y a-t-il une limitation de l'indice de tranche?
Aller à la foire aux questions (FAQ)
Pourquoi les instructions ++ et - et non les expressions? Et pourquoi le suffixe, pas le préfixe?
Sans arithmétique de pointeur, la valeur de commodité des opérateurs d'incrémentation pré et postfix diminue. En les supprimant complètement de la hiérarchie des expressions, la syntaxe des expressions est simplifiée et les problèmes compliqués concernant l'ordre d'évaluation de ++ et considérez f (i ++) et p [i] = q [++ i]) sont également éliminés. . La simplification est importante. En ce qui concerne le suffixe par rapport au préfixe, l'un ou l'autre fonctionnerait bien, mais la version du suffixe est plus traditionnelle; l'insistance sur le préfixe est apparue avec la STL, une bibliothèque pour une langue dont le nom contient, ironiquement, un incrément postfixé.
--- (La spécification du langage de programmation Go
Les instructions "++" et "-" incrémentent ou décrémentent leurs opérandes de la constante non typée 1. Comme pour une affectation, l'opérande doit être adressable ou une expression d'index de mappage.
IncDecStmt = Expression ( "++" | "--" ) .
Les instructions d'affectation suivantes sont sémantiquement équivalentes:
IncDec statement Assignment x++ x += 1 x-- x -= 1
Écrire,
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]
}
Ce qui, dans votre cas particulier, se simplifie,
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]
}
Selon la spécification de langue, http://golang.org/ref/spec#IncDec_statements , i ++ est un IncDec statements
, qui est un statement
, mais pas un expression
. Quant à args[index]
, l'index doit être un expression
. Vous voulez plus de détails, lisez-le simplement Go Language Specification, c'est exactement ce que la langue demande.
Comme d'autres l'ont dit i++
est une instruction dans go, pas une expression comme dans c. go a une manière différente d'exprimer la même intention en utilisant l'affectation multiple:
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)
}
Votre définition de map
aurait également échoué lors de l'exécution.
++
l'opérateur est décevant. Voici mon 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)]
}