0

いくつかの構造体によって実装されているインターフェイスがあります。私のメソッドの 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 値に非整列化できません

実装されたUnmarshalJSONforに実際の本文がないことはわかっtruckていますが、少なくともメッセージが出力されることを期待しています。

私は何を間違っていますか?

4

1 に答える 1