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>
린트 검사기는 다음 오류를 발생시킵니다. "범위 범위에서 변수 사용 x in function literal (scopelint)".
오류는 t.Run()에 전달된 함수 리터럴 내에서 루프 변수 x를 사용하여 발생합니다. 컴파일러는 t.Run()이 반환된 후에 함수 리터럴이 호출될지 여부를 확신하지 못합니다. 만약 그렇다면, 함수 리터럴은 루프 변수를 참조할 것이며, 이는 잠재적으로 다음 반복의 값으로 덮어쓸 수 있습니다.
문제를 해결하려면 다음을 수정하세요. 루프 변수의 값을 함수 리터럴에 전달하거나 복사본을 만드는 코드입니다. 함수 시그니처가 고정되어 있으므로 다음과 같이 변수의 복사본을 만듭니다.
<code class="go">x2 := x</code>
그런 다음 함수 리터럴 내에서 x2를 참조합니다. 이는 린트 검사기를 만족시킵니다.
또는 복사본을 만들려는 의도가 분명하므로 복사본과 루프 변수 모두에 동일한 이름을 사용할 수 있습니다.
<code class="go">x := x</code>
이것은 루프 변수를 섀도잉하여 함수 리터럴에 대해 로컬로 만듭니다.
위 내용은 Go에서 \'함수 리터럴(scopelint)\'에서 범위 범위 x의 변수 사용'을 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!