"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 > Aqui estão algumas opções de título, tendo em mente a necessidade de um formato de pergunta: * **Por que `json.Unmarshal` retorna um mapa em vez de uma estrutura no Go?** (Simples e direto) * **Golang: Desempacotando int

Aqui estão algumas opções de título, tendo em mente a necessidade de um formato de pergunta: * **Por que `json.Unmarshal` retorna um mapa em vez de uma estrutura no Go?** (Simples e direto) * **Golang: Desempacotando int

Publicado em 2024-11-08
Navegar:352

Here are a few title options, keeping in mind the need for a question format:

* **Why Does `json.Unmarshal` Return a Map Instead of a  Struct in Go?** (Simple and direct)
* **Golang: Unmarshaling into an Interface - Why is My Struct a Map?** (More specif

Por que json.Unmarshal retorna um mapa em vez da estrutura esperada?

Neste exemplo de playground, json.Unmarshal retorna um mapa em vez da estrutura esperada: http ://play.golang.org/p/dWku6SPqj5.

O problema surge porque um parâmetro de interface{} é passado para json.Unmarshal, e a biblioteca tenta desempacotá-lo em uma matriz de bytes. No entanto, a biblioteca não possui uma referência direta à estrutura correspondente, embora tenha uma referência reflect.Type.

O problema está no seguinte código:

var ping interface{} = Ping{}
deserialize([]byte(`{"id":42}`), &ping)
fmt.Println("DONE:", ping) // It's a simple map now, not a Ping. Why?

Para resolver esse problema, passe um ponteiro para a estrutura Ping explicitamente como uma interface abstrata:

var ping interface{} = &Ping{}
deserialize([]byte(`{"id":42}`), ping)
fmt.Println("DONE:", ping)

Como alternativa, se um ponteiro direto não estiver disponível, crie um novo ponteiro usando refletir, desserialize nele e copie o valor de volta:

var ping interface{} = Ping{}
nptr := reflect.New(reflect.TypeOf(ping))
deserialize([]byte(`{"id":42}`), nptr.Interface())
ping = nptr.Interface()
fmt.Println("DONE:", ping)
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