In Go ist es eine gängige Praxis, Funktionsliterale zu definieren und sie an Funktionen höherer Ordnung zu übergeben. Die Verwendung von Bereichsvariablen innerhalb von Funktionsliteralen kann jedoch Bedenken hinsichtlich des Variablenbereichs aufwerfen.
Im folgenden Codeausschnitt:
<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>
Der Lint-Checker löst den Fehler aus: „Verwendung der Variablen im Bereichsbereich.“ x im Funktionsliteral (scopelint)".
Der Fehler ergibt sich aus der Verwendung der Schleifenvariablen x innerhalb des an t.Run() übergebenen Funktionsliterals. Der Compiler ist sich nicht sicher, ob das Funktionsliteral nach der Rückkehr von t.Run() aufgerufen wird. Wäre dies der Fall, würde sich das Funktionsliteral auf die Schleifenvariable beziehen, die möglicherweise mit dem Wert aus der nächsten Iteration überschrieben werden könnte.
Um das Problem zu beheben, ändern Sie Der Code, um den Wert der Schleifenvariablen an das Funktionsliteral zu übergeben oder eine Kopie davon zu erstellen. Da die Funktionssignatur fest ist, erstellen Sie eine Kopie der Variablen wie folgt:
<code class="go">x2 := x</code>
Verweisen Sie dann im Funktionsliteral auf x2. Dies genügt dem Lint-Checker.
Alternativ kann, da die Absicht, eine Kopie zu erstellen, klar ist, derselbe Name sowohl für die Kopie als auch für die Schleifenvariable verwendet werden:
<code class="go">x := x</code>
Dies schattiert die Schleifenvariable und macht sie lokal für das Funktionsliteral.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit „Verwenden der Variablen im Bereichsbereich x im Funktionsliteral (scopelint)' in Go um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!