いくつかの構造体によって実装されているインターフェイスがあります。私のメソッドの 1 つで、指定された文字列に基づいて構造体ベースをインスタンス化し、json を解析して定義済み構造体に変換します。そのために、UnmarshalJSON を実装しましたが、呼び出されることはありません。
インターフェース:
type vehicle interface {
vehicleType() string
numberOfWheels() int
EngineType() string
}
インターフェイスを実装する 2 つの構造体:
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: オブジェクトを型 main.vehicle の Go 値に非整列化できません
実装されたUnmarshalJSON
forに実際の本文がないことはわかっtruck
ていますが、少なくともメッセージが出力されることを期待しています。
私は何を間違っていますか?