"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Aquí hay algunas opciones de títulos, teniendo en cuenta la necesidad de un formato de pregunta: * **¿Por qué `json.Unmarshal` devuelve un mapa en lugar de una estructura en Go?** (Simple y directo) * **Golang: Desclasificación int

Aquí hay algunas opciones de títulos, teniendo en cuenta la necesidad de un formato de pregunta: * **¿Por qué `json.Unmarshal` devuelve un mapa en lugar de una estructura en Go?** (Simple y directo) * **Golang: Desclasificación int

Publicado el 2024-11-08
Navegar:154

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 qué json.Unmarshal devuelve un mapa en lugar de la estructura esperada?

En este ejemplo de área de juegos, json.Unmarshal devuelve un mapa en lugar de la estructura esperada: http ://play.golang.org/p/dWku6SPqj5.

El problema surge porque se pasa un parámetro de interfaz{} a json.Unmarshal y la biblioteca intenta descomponerlo en una matriz de bytes. Sin embargo, la biblioteca no tiene una referencia directa a la estructura correspondiente, aunque tiene una referencia reflect.Type.

El problema radica en el siguiente 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 este problema, pase un puntero a la estructura Ping explícitamente como una interfaz abstracta:

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

Como alternativa, si un puntero directo no está disponible, cree un nuevo puntero usando reflect, deserialícelo y luego copie el valor nuevamente:

var ping interface{} = Ping{}
nptr := reflect.New(reflect.TypeOf(ping))
deserialize([]byte(`{"id":42}`), nptr.Interface())
ping = nptr.Interface()
fmt.Println("DONE:", ping)
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3