Heim  >  Artikel  >  Backend-Entwicklung  >  Wie gehe ich mit „Verwenden der Variablen im Bereichsbereich x im Funktionsliteral (scopelint)“ in Go um?

Wie gehe ich mit „Verwenden der Variablen im Bereichsbereich x im Funktionsliteral (scopelint)“ in Go um?

Linda Hamilton
Linda HamiltonOriginal
2024-10-26 23:24:30642Durchsuche

How to Address

Bereichsvariablen in Funktionsliteralen verwenden (scopelint)

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)".

Verstehen des Problems

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.

Lösung: Variablenkopien verwenden

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn