문제:
다음 코드 조각에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!