Go에서 \'함수 리터럴(scopelint)\'에서 범위 범위 x의 변수 사용'을 해결하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-10-26 23:24:30
원래의
641명이 탐색했습니다.

How to Address

함수 리터럴에서 범위 변수 사용(scopelint)

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!