"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 > Como usar a reflexão para modificar campos estruturais com CanSet() e Structs?

Como usar a reflexão para modificar campos estruturais com CanSet() e Structs?

Publicado em 2024-11-09
Navegar:231

How to Use Reflection to Modify Struct Fields with CanSet() and Structs?

Usando reflexão para modificar campos struct: CanSet() e Structs

Ao usar reflexão para modificar campos struct, é importante entender os princípios por trás da acessibilidade e modificação do campo.

CanSet() for Structs

No seu exemplo, você encontrou CanSet() retornando false para campos struct. Isso ocorre porque, por padrão, Go não permite modificar campos não exportados (privados) de uma estrutura usando reflexão. Esta é uma medida de segurança para evitar modificações acidentais ou maliciosas do estado da estrutura interna.

Resolvendo os problemas

Para definir os valores dos campos de estrutura usando reflexão, considere o seguinte etapas:

  1. Modificar um valor: Ao chamar sua função SetField(), passe o ponteiro para a estrutura, não para a estrutura valor em si. Isso permite que você modifique a estrutura real, não uma cópia.
  2. Use Value.Elem() para ponteiros: Se você passar um ponteiro para a estrutura, precisará usar reflect.ValueOf (source).Elem() para obter o reflect.Value da estrutura apontada. Isso navega até o valor real da estrutura.
  3. Use FieldByName para acesso ao campo: Em vez de percorrer todos os campos da estrutura, use v.FieldByName(fieldName) para acessar o campo específico que você deseja para modificar. Isso garante que você acesse o campo correto e é mais eficiente.

Código modificado

Aqui está o código modificado que resolve os problemas:

func SetField(source interface{}, fieldName string, fieldValue string) {
    v := reflect.ValueOf(source).Elem()
    fmt.Println(v.FieldByName(fieldName).CanSet())

    if v.FieldByName(fieldName).CanSet() {
        v.FieldByName(fieldName).SetString(fieldValue)
    }
}

func main() {
    source := ProductionInfo{}
    source.StructA = append(source.StructA, Entry{Field1: "A", Field2: 2})

    fmt.Println("Before: ", source.StructA[0])
    SetField(&source.StructA[0], "Field1", "NEW_VALUE")
    fmt.Println("After: ", source.StructA[0])
}

Este código agora modificará com sucesso o valor Field1 da estrutura Entry.

Declaração de lançamento Este artigo foi reimpresso em: 1729741550 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
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