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