Obtendo endereços de campo em estruturas aninhadas usando reflexão
Neste cenário, você deseja percorrer e examinar estruturas aninhadas e obter os endereços de não campos de ponteiro dentro deles. Usando reflexão, você tem uma função que itera através de campos, mas encontra dificuldades para obter o endereço de memória de campos não-ponteiros localizados em subestruturas incorporadas.
Para corrigir esse problema, é crucial observar que valueField.Interface() faz não fornece o resultado esperado porque retorna o valor real armazenado no campo, o que não é válido ao trabalhar com tipos que não são ponteiros.
A solução está em modificar a função InspectStructV para receber um reflect.Value em vez de uma interface{}. Isso permite manipular diretamente o objeto de reflexão e recuperar o endereço do campo. Além disso, ao chamar recursivamente InspectStructV para campos struct, valueField, que anteriormente continha o valor da interface, agora aponta diretamente para o valor de reflexão da estrutura aninhada, garantindo que o endereço possa ser recuperado corretamente.
Aqui está o código revisado snippet:
func InspectStructV(val reflect.Value) {
if val.Kind() == reflect.Interface && !val.IsNil() {
elm := val.Elem()
if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
val = elm
}
}
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
for i := 0; i Ao fazer essas alterações, você poderá recuperar com êxito os endereços de memória de campos que não são ponteiros, mesmo quando eles residirem em estruturas aninhadas.
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