在 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中文網其他相關文章!