Создать экземпляр среза, используя отражение во время выполнения - PullRequest
0 голосов
/ 06 июня 2018

Я пытался передать часть структур, то есть []carDetail или []bikeDetail, которые реализуют интерфейс IMapping в func fetch(url string, itemList []IMapping) (error).Но потом наткнулся на эту ссылку .GoLang не поддерживает это.Итак, изменили подпись на func fetch(url string, itemList IMapping) (error).Теперь я пытаюсь передать структуру carDetail или bikeDetail в функцию и в функцию fetch, пытаясь создать фрагмент структуры с помощью отражения.Итак, как я могу это сделать?Что еще можно передать в методе json.Unmarshal для сопоставления json со структурой.

type IMapping interface {
        GetId() int
    }

    type carDetail struct {
        ModelId    int    `json:"modelId"`
        CarName  string `json:"carName"`
    }
    func (m *carDetail) GetId() int {
        return m.ModelID
    }

    type bikeDetail struct {
        ModelId    int    `json:"modelId"`
        BikeName  string `json:"bikeName"`
    }

    func (m *bikeDetail) GetId() int {
        return m.ModelID
    }

    func fetch(url string, itemList IMapping) (error) {

        var myClient = &http.Client{}
        r, err := myClient.Get(url)
        body, err := ioutil.ReadAll(r.Body)
        defer r.Body.Close()

        // how to create slice at run time using reflection say objVehicle

        err = json.Unmarshal(body, &objVehicle)

        .....
    }

1 Ответ

0 голосов
/ 06 июня 2018

Объявите fetch, чтобы принять интерфейс {}: аргумент:

func fetch(url string, itemList interface{}) (error) {
    var myClient = &http.Client{}
    r, err := myClient.Get(url)
    body, err := ioutil.ReadAll(r.Body)
    defer r.Body.Close()
    err = json.Unmarshal(body, itemList)
    .....
}

Вызовите его с указателем на фрагмент соответствующего типа:

var details []carDetail
err := fetch(u, &details)

При таком подходефункция json.Umarshal выполняет всю тяжелую работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...