为了账号安全,请及时绑定邮箱和手机立即绑定

当作为interface{}返回map传递时解码为struct

当作为interface{}返回map传递时解码为struct

Go
一只斗牛犬 2023-07-26 17:12:36
使用 mongo-driver 时,我有这个结构,我将其作为 interface{} 传递给 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 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

您需要创建接口字段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

}



查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信