Scopelint-Fehler: Variable im Bereichsbereich verwenden
In einer Testfunktion TestGetUID stößt der Code auf einen von Scopelint gemeldeten Fehler, der davor warnt Verwenden der Variablen x aus dem Bereichsbereich innerhalb von Funktionsliteralen.
Betrachten Sie den folgenden Code Zeilen:
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)
})
}
Der Fehler betrifft diese Zeilen, da x die Schleifenvariable innerhalb der Bereichsschleife ist, die über das Testsegment iteriert. Scopelint erkennt, dass x in an t.Run() übergebenen Funktionsliteralen verwendet wird, was zu potenziellen Problemen führen kann, wenn die Funktionsliterale nach der Rückkehr von t.Run() aufgerufen werden.
Ursache und Best Practices
Das Problem entsteht, weil der Compiler nicht garantieren kann, dass die erstellten und an t.Run() übergebenen Funktionsliterale danach nicht aufgerufen werden t.Run() wird beendet. Wenn die Funktionsliterale nach der Rückkehr von t.Run() aufgerufen würden, würden sie auf die x-Variable verweisen, die möglicherweise mit dem Wert aus der nachfolgenden Iteration der Schleife überschrieben wurde.
Go vet löst diese Warnung aus Verhindern Sie ein solches unbeabsichtigtes Verhalten, das zu Fehlern oder sogar Datenrennen führen kann, wenn die Funktionsliterale gleichzeitig in verschiedenen Goroutinen ausgeführt werden.
Die empfohlene Best Practice in solchen Fällen besteht darin, entweder das zu übergeben Wert der Schleifenvariablen in das Funktionsliteral als Argument einfügen oder eine Kopie der Schleifenvariablen erstellen und auf die Kopie innerhalb des Funktionsliterals verweisen. Da die Signatur des Funktionsliterals nicht geändert werden kann, besteht die empfohlene Lösung darin, eine Kopie zu erstellen, zum Beispiel:
x2 := x
Nach der Deklaration dieser Kopie wird der x-Bezeichner innerhalb der Das Funktionsliteral bezieht sich auf die lokale Kopie, nicht auf die Schleifenvariable. Auch wenn es verwirrend erscheinen mag, der Kopie denselben Namen zuzuordnen, weist sie doch deutlich auf die Absicht hin, eine Kopie zu verwenden.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3