"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 obter endereços de campo em estruturas aninhadas usando reflexão?

Como obter endereços de campo em estruturas aninhadas usando reflexão?

Publicado em 2024-11-10
Navegar:735

How to Obtain Field Addresses in Nested Structures Using Reflection?

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.

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