Декодирование в структуру при передаче как интерфейс {} возвращает карту - PullRequest
0 голосов
/ 29 сентября 2019

При использовании mongo-драйвера у меня есть эта структура, которую я передаю функции get в качестве интерфейса {}. Проблема в том, что когда я использую метод Decode, он возвращает карту, пока я ожидал структуру правильного типа. Я нашел похожий вопрос здесь , но решение не сработало для меня, программа вылетает.

type Item struct {
 //whatever
}

type mymodel struct {
    I            interface{} 
    F            interface{}
    DatabaseName string
    Collection   string
}

func Do(){
    var item Item
    var filter Item

    m:= mymodel{I: item, F: filter}
    res,_ := get(m)
}

func get(m mymodel) (*interface{}, error) {

    c := database.DBCon.Database("whatever").Collection("whatever")

    ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
    err := c.FindOne(ctx, m.F).Decode(&m.I)
    if err != nil {
        log.Log.Info(err)
        return nil, err
    }


    return &m.I, nil

}

1 Ответ

1 голос
/ 29 сентября 2019

Вам нужно сделать поля интерфейса I и F для хранения указателя на экземпляр, в который вы хотите декодировать данные (возможно, не F, поскольку вы ничего не декодируете в это), а затемпередать их напрямую Decode, без каких-либо дополнительных операций с адресами (&x).

Например:

func Do(){
    var item Item
    var filter Item

    m:= mymodel{I: &item, F: filter}
    res,_ := get(m)
}

func get(m mymodel) (*interface{}, error) {
    c := database.DBCon.Database("whatever").Collection("whatever")

    ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
    err := c.FindOne(ctx, m.F).Decode(m.I)
    if err != nil {
        log.Log.Info(err)
        return nil, err
    }

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