«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Вот несколько вариантов заголовка, учитывая необходимость формата вопроса: * **Почему `json.Unmarshal` возвращает карту вместо структуры в Go?** (Просто и понятно) * **Golang: демаршалинг int

Вот несколько вариантов заголовка, учитывая необходимость формата вопроса: * **Почему `json.Unmarshal` возвращает карту вместо структуры в Go?** (Просто и понятно) * **Golang: демаршалинг int

Опубликовано 8 ноября 2024 г.
Просматривать:231

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

Почему json.Unmarshal возвращает карту вместо ожидаемой структуры?

В этом примере игровой площадки json.Unmarshal возвращает карту вместо ожидаемой структуры: http ://play.golang.org/p/dWku6SPqj5.

Проблема возникает из-за того, что параметр интерфейса {} передается в json.Unmarshal, и библиотека пытается демаршалировать его в массив байтов. Однако библиотека не имеет прямой ссылки на соответствующую структуру, хотя у нее есть ссылка наreflect.Type.

Проблема заключается в следующем коде:

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

Чтобы решить эту проблему, либо передайте указатель на структуру Ping явно как абстрактный интерфейс:

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

В качестве альтернативы, если прямой указатель недоступен, создайте новый указатель с помощью отражения, десериализуйте его, а затем скопируйте значение обратно:

var ping interface{} = Ping{}
nptr := reflect.New(reflect.TypeOf(ping))
deserialize([]byte(`{"id":42}`), nptr.Interface())
ping = nptr.Interface()
fmt.Println("DONE:", ping)
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3