Scopelint 錯誤:在範圍範圍上使用變數
Scopelint 錯誤:在範圍範圍上使用變數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)
})
}
考慮以下程式碼行:for _, x := 範圍測試 { t.Run(x.description, func(t *testing.T) { 客戶端 := fake.NewSimpleClientset(x.objs...) 實際 := getUID(客戶端, x.namespace) 斷言.Equal(t, x.預期, 實際) }) }錯誤與這些行有關,因為 x 是在測試切片上迭代的範圍循環內的循環變數。 Scopelint 偵測到 x 正在傳遞給 t.Run() 的函數文字中使用,如果在 t.Run() 返回後呼叫函數文字,則可能會導致潛在問題。
原因和最佳實踐出現這個問題是因為編譯器無法保證創建並傳遞給t.Run() 的函數文字在之後不會被調用t.Run() 退出。如果在 t.Run() 返回後呼叫函數文字,它們將引用 x 變量,該變數可能已被循環後續迭代中的值覆蓋。 Go vet 會將此警告提出防止這種意外行為,如果函數文字在不同的 goroutine 中同時執行,可能會導致錯誤甚至資料競爭。 在這種情況下,建議的最佳實踐是透過
循環變數的值x2 := x
並引用函數文字內的副本。由於函數字面量的簽章無法更改,建議的解決方案是建立副本,例如:x2 := x
聲明此副本後,函式文字將引用本機副本,而不是循環變數。雖然為副本分配相同的名稱可能看起來很混亂,但它清楚地表明了使用副本的意圖。免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3