Problème :
Dans l'extrait de code suivant, le go vet L'outil signale une erreur : "Utilisation de la variable sur la portée de plage x dans la fonction littérale (scopelint)".
<code class="go">func TestGetUID(t *testing.T) { 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>
Explication :
Le message d'erreur indique que x, qui est une variable de boucle, est utilisé dans un littéral de fonction transmis à t.Run(). Le compilateur ne peut pas garantir que la fonction littérale ne sera pas appelée après le retour de t.Run(), ce qui pourrait conduire à une course aux données ou à un autre comportement inattendu.
Solution :
Pour résoudre ce problème, vous pouvez faire une copie de x et utiliser cette copie dans la fonction littérale :
<code class="go">func TestGetUID(t *testing.T) { for _, x := range tests { x2 := x // Copy the value of x t.Run(x2.description, func(t *testing.T) { client := fake.NewSimpleClientset(x2.objs...) actual := getUID(client, x2.namespace) assert.Equal(t, x2.expected, actual) }) } }</code>
Vous pouvez également observer la variable de boucle x en l'attribuant à une nouvelle variable du même nom dans la fonction littérale :
<code class="go">func TestGetUID(t *testing.T) { for _, x := range tests { t.Run(x.description, func(t *testing.T) { x := x // Shadow the loop variable client := fake.NewSimpleClientset(x.objs...) actual := getUID(client, x.namespace) assert.Equal(t, x.expected, actual) }) } }</code>
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!