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:
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.
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