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