„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > ## Scopelint-Fehler: Variable im Bereichsbereich verwenden – Wie kann man in Funktionsliteralen sicher auf Schleifenvariablen verweisen?

## Scopelint-Fehler: Variable im Bereichsbereich verwenden – Wie kann man in Funktionsliteralen sicher auf Schleifenvariablen verweisen?

Veröffentlicht am 08.11.2024
Durchsuche:570

## Scopelint Error: Using Variable on Range Scope - How to Safely Refer to Loop Variables in Function Literals?

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.

Neuestes Tutorial Mehr>

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