Comportement différent entre les variables et les valeurs de retour dans les fonctions
Lors de l'utilisation de fonctions dans Go, il est crucial de comprendre la distinction entre les variables et les valeurs de retour en termes d'adressabilité et de comportement ultérieur.
Code d'origine et erreur
Considérez l'extrait de code suivant :
<code class="go">hash := sha1.Sum([]byte(uf.Pwd)) u.Pwhash = hex.EncodeToString(hash[:])</code>
Ce code fonctionne comme attendu. Cependant, si nous essayons de combiner les deux lignes :
<code class="go">u.Pwhash = hex.EncodeToString(sha1.Sum([]byte(uf.Pwd))[:])</code>
nous rencontrons l'erreur suivante :
models/models.go:104: invalid operation sha1.Sum(([]byte)(uf.Pwd))[:] (slice of unaddressable value)
Raison de l'erreur
L'erreur survient car dans la ligne combinée, nous essayons de découper directement la valeur de retour de la fonction sha1.Sum() :
<code class="go">sha1.Sum(([]byte)(uf.Pwd))[:]</code>
Les valeurs de retour de la fonction dans Go ne sont pas adressables. Selon la spécification du langage, les valeurs adressables incluent les variables, les indirections de pointeurs, les opérations d'indexation de tranches, les sélecteurs de champs de structures adressables, les opérations d'indexation de tableaux de tableaux adressables et, à titre d'exception, les littéraux composites. Découper un tableau nécessite que le tableau soit adressable.
Résolution
Le code d'origine fonctionne car nous attribuons d'abord la valeur de retour de sha1.Sum() à une variable locale (hachage), ce qui rend le tableau adressable et donc éligible au découpage. Par conséquent, il est généralement recommandé de stocker les valeurs de retour dans des variables avant d'effectuer des opérations sur celles-ci pour éviter de telles erreurs et garantir l'adressabilité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!