"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 > Por que a função `reflect.MakeSlice` está retornando um valor não endereçável?

Por que a função `reflect.MakeSlice` está retornando um valor não endereçável?

Publicado em 2024-11-10
Navegar:196

Why is the `reflect.MakeSlice` Function Returning an Un-Addressable Value?

Por que refletir.MakeSlice retorna valor não endereçável

No Go, o pacote reflect fornece uma interface para inspecionar e manipular tipos e valores. reflect.MakeSlice cria uma fatia de um determinado tipo. No entanto, o valor retornado não é endereçável. Isso significa que você não pode pegar seu endereço ou atribuí-lo a um ponteiro.

Solução: usando reflect.New()

Para obter uma fatia endereçável usando reflexão, você pode usar a função reflect.New() para criar um ponteiro para a fatia. Isso pode ser feito da seguinte maneira:

// Create the slice type
sliceType := reflect.SliceOf(SomeType)

// Create a slice using reflect.MakeSlice
slice := reflect.MakeSlice(sliceType, 10, 10)

// Create a pointer to the slice
slicePtr := reflect.New(slice.Type())

// Set the slice pointer to the slice
slicePtr.Elem().Set(slice)

Agora, você tem uma fatia endereçável que pode ser passada como argumento para funções que requerem um ponteiro de fatia.

Por que refletir. MakeSlice retorna valor não endereçável

Variáveis ​​de pilha locais em Go não são endereçáveis ​​porque o tempo de execução pode movê-las para o heap a qualquer momento. reflect.MakeSlice cria uma variável de fatia local, e é por isso que o valor retornado não é endereçável.

Por que um ponteiro para uma fatia é necessário

Algumas APIs, como como aquele que você mencionou no pacote mgo, requer um ponteiro para uma fatia como argumento. Isso ocorre porque ao anexar à fatia, uma nova fatia com maior capacidade pode ser alocada. Se você passar uma fatia sem ponteiro, as alterações feitas na fatia não serão visíveis fora da função.

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