В этом примере игровой площадки 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