"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > ## Erro Scopelint: Usando variável no escopo do intervalo - Como consultar com segurança variáveis ​​de loop em literais de função?

## Erro Scopelint: Usando variável no escopo do intervalo - Como consultar com segurança variáveis ​​de loop em literais de função?

Publicado em 2024-11-08
Navegar:317

## Scopelint Error: Using Variable on Range Scope - How to Safely Refer to Loop Variables in Function Literals?

Erro Scopelint: usando variável no escopo do intervalo

Em uma função de teste TestGetUID, o código encontra um erro relatado pelo scopelint, que avisa contra usando a variável x do escopo de intervalo dentro de literais de função.

Considere as seguintes linhas de código:

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)
    })
}

O erro pertence a essas linhas porque x é a variável de loop dentro do loop de intervalo iterando sobre a fatia de testes. O Scopelint detecta que x está sendo usado em literais de função passados ​​para t.Run(), o que pode levar a possíveis problemas se os literais de função forem invocados após o retorno de t.Run().

Causa e Melhores práticas

O problema surge porque o compilador não pode garantir que os literais de função criados e passados ​​para t.Run() não serão chamados após a saída de t.Run(). Se os literais da função fossem chamados após o retorno de t.Run(), eles se refeririam à variável x, que pode ter sido substituída pelo valor da iteração subsequente do loop.

Go vet levanta este aviso para evitar esse comportamento não intencional, que pode resultar em bugs ou até mesmo corridas de dados se os literais da função forem executados simultaneamente em goroutines diferentes.

A prática recomendada nesses casos é passar o valor da variável de loop para a função literal como um argumento ou para criar uma cópia da variável de loop e referir-se à cópia dentro da função literal. Como a assinatura do literal da função não pode ser alterada, a solução recomendada é criar uma cópia, por exemplo:

x2 := x

Depois de declarar esta cópia, o identificador x dentro do a função literal se referirá à cópia local, não à variável de loop. Embora atribuir o mesmo nome à cópia possa parecer confuso, isso indica claramente a intenção de usar uma cópia.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3