Maison >développement back-end >Golang >Comment résoudre « Utilisation de la variable sur la plage de portée x dans la fonction littérale (scopelint) » dans Go ?
Dans Go, il est courant de définir des littéraux de fonction et de les transmettre à des fonctions d'ordre supérieur. Cependant, l'utilisation de variables de plage dans des littéraux de fonction peut soulever des problèmes concernant la portée de la variable.
Dans l'extrait de code suivant :
<code class="go">func TestGetUID(t *testing.T) { namespace := "lkfm" expecteduid := "fake_uid" var tests = []struct { description string expected string namespace string objs []runtime.Object }{ {"PositiveScenario", expecteduid, namespace, []runtime.Object{simpleNamespace(namespace)}}, } for _, x := range tests { t.Run(x.description, func(t *testing.T) { client := fake.NewSimpleClientset(x.objs...) actual := getUID(client, x.namespace) assert.Equal(t, x.expected, actual) }) } }</code>
Le vérificateur de charpie génère l'erreur : "Utilisation de la variable sur la portée de la plage x dans le littéral de fonction (scopelint)".
L'erreur provient de l'utilisation de la variable de boucle x dans le littéral de fonction transmis à t.Run(). Le compilateur ne sait pas si la fonction littérale sera appelée après le retour de t.Run(). Si tel était le cas, le littéral de fonction ferait référence à la variable de boucle, qui pourrait potentiellement être écrasée par la valeur de la prochaine itération.
Pour résoudre le problème, modifiez le code pour transmettre la valeur de la variable de boucle au littéral de fonction ou en créer une copie. Puisque la signature de la fonction est fixe, créez une copie de la variable comme suit :
<code class="go">x2 := x</code>
Ensuite, faites référence à x2 dans le littéral de la fonction. Cela satisfera le vérificateur de charpie.
Alternativement, puisque l'intention de faire une copie est claire, le même nom peut être utilisé à la fois pour la copie et la variable de boucle :
<code class="go">x := x</code>
Ceci masquera la variable de boucle et la rendra locale au littéral de la fonction.
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!