У меня есть интерфейс, реализованный несколькими структурами. В одном из моих методов я создаю базу структуры на основе заданной строки, а затем анализирую json в определенной структуре. Для этого я реализовал UnmarshalJSON, но он никогда не вызывается.
Интерфейс:
type vehicle interface {
vehicleType() string
numberOfWheels() int
EngineType() string
}
Две структуры, реализующие интерфейс:
type truck struct {
loadCapacity int
capacityUnits string
}
func (t truck) vehicleType() string {
return "Truck"
}
func (t truck) numberOfWheels() int {
return 6
}
func (t truck) EngineType() string {
return "Gasoline"
}
func (t *truck) UnmarshalJSON(data []byte) error {
fmt.Println("Here in custom unmarshal")
return nil
}
// -------------------------------------------
type ev struct {
capacityInKWh int
}
func (e ev) vehicleType() string {
return "Electric Vehicle"
}
func (e ev) numberOfWheels() int {
return 4
}
func (e ev) EngineType() string {
return "Electric"
}
func (e ev) Capacity() int {
return e.capacityInKWh
}
Обратите внимание, что моя структура truck
также реализует пользовательский UnmarshalJSON.
Теперь, в основном, я пытаюсь сделать следующее:
func main() {
jsonData := []byte(`{"loadCapacity": 1000, "capacityUnits": "lb"}`)
vehicleType := "truck"
processVehicle(vehicleType, jsonData)
}
func processVehicle(vehicleType string, data []byte) {
var myVehicle vehicle
fmt.Println("Processing vehicle...")
switch vehicleType {
case "truck":
myVehicle = truck{}
}
err := json.Unmarshal(data, &myVehicle)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(myVehicle)
}
Но я получаю следующую ошибку:
json: невозможно преобразовать объект в значение Go типа main.vehicle
Я знаю, что в реализованном UnmarshalJSON
для truck
нет фактического тела, но я ожидаю, что по крайней мере сообщение будет напечатано.
Что я делаю не так?