首頁  >  文章  >  後端開發  >  如何解決 Go 中的「在函數文字 (scopelint) 中使用範圍範圍 x 上的變數」?

如何解決 Go 中的「在函數文字 (scopelint) 中使用範圍範圍 x 上的變數」?

Linda Hamilton
Linda Hamilton原創
2024-10-26 23:24:30642瀏覽

How to Address

在函數文字中使用範圍變數 (scopelint)

在 Go 中,定義函數文字並將其傳遞給高階函數是一種常見的做法。但是,在函數文字中使用範圍變數可能會引發有關變數範圍的問題。

在以下程式碼片段中:

<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>

lint 檢查器會引發錯誤:「在範圍範圍內使用變數函數文字中的 x (scopelint)」。

理解問題

錯誤源自於在傳遞給 t.Run() 的函數文字中使用循環變數 x。編譯器不確定 t.Run() 傳回後是否會呼叫函數文字。如果是,函數文字將引用循環變量,該變數可能會被下一次迭代的值覆蓋。

解決方案:使用變數副本

要解決此問題,請修改將循環變數的值傳遞給函數文字或建立其副本的程式碼。由於函數簽章是固定的,請如下建立變數的副本:

<code class="go">x2 := x</code>

然後,在函數文字中引用 x2。這將滿足 lint 檢查器的要求。

或者,由於製作副本的意圖很明確,因此副本和循環變量可以使用相同的名稱:

<code class="go">x := x</code>

這將隱藏循環變量並使其成為函數文字的本地變量。

以上是如何解決 Go 中的「在函數文字 (scopelint) 中使用範圍範圍 x 上的變數」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn