问题:
在下面的代码片段中,go vet工具报告错误:“在函数文字 (scopelint) 中使用范围范围 x 上的变量”。
<code class="go">func TestGetUID(t *testing.T) { 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>
说明:
错误消息表明x 是一个循环变量,在传递给 t.Run() 的函数文字中使用。编译器无法保证在 t.Run() 返回后不会调用函数文字,这可能会导致数据争用或其他意外行为。
解决方案:
要解决此问题,您可以复制 x 并在函数文字中使用该副本:
<code class="go">func TestGetUID(t *testing.T) { for _, x := range tests { x2 := x // Copy the value of x t.Run(x2.description, func(t *testing.T) { client := fake.NewSimpleClientset(x2.objs...) actual := getUID(client, x2.namespace) assert.Equal(t, x2.expected, actual) }) } }</code>
或者,您可以通过将循环变量 x 分配给循环变量的新变量来隐藏它。函数文字中的名称相同:
<code class="go">func TestGetUID(t *testing.T) { for _, x := range tests { t.Run(x.description, func(t *testing.T) { x := x // Shadow the loop variable client := fake.NewSimpleClientset(x.objs...) actual := getUID(client, x.namespace) assert.Equal(t, x.expected, actual) }) } }</code>
以上是为什么我在 Go 中收到'在函数文字中使用范围 x 上的变量”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!