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

如何通过引用将结构数组作为接口传递

如何通过引用将结构数组作为接口传递

Go
ABOUTYOU 2023-07-31 17:15:27
我正在尝试读取给定 Firestore 集合下的所有文档并将文档作为结构数组返回。函数内的日志将数据输出为Firestore文档,但函数外的struct数组始终是空数组。读取集合下所有文档的功能。func (fc *FirebaseClient) ReadCollection(collectionPath string, objects interface{}) error {    ctx := context.Background()    opt := option.WithCredentialsJSON([]byte(os.Getenv("FIREBASE_CREDENTIALS")))    client, err := firestore.NewClient(ctx, os.Getenv("FIREBASE_PROJECT_ID"), opt)    if err != nil {        return err    }    defer client.Close()    collectionRef := client.Collection(collectionPath)    docs, err := collectionRef.DocumentRefs(ctx).GetAll()    if err != nil {        return err    }    log.Printf("Total documents: %i", len(docs))    objs := make([]interface{}, len(docs))    for i, doc := range docs {        docsnap, err := doc.Get(ctx)        if err != nil {            return err        }        if err := docsnap.DataTo(&objs[i]); err != nil {            return err        }        log.Printf("obj: %v", objs[i])    }    objects = objs    log.Printf("objects: %v", objects)    return nil}调用函数的代码    var ss []SomeStruct    fc := new(insightech.FirebaseClient)    if err := fc.ReadCollection("mycollection", ss); err != nil {        return    }ss始终是一个空数组。我不想指定结构类型的原因是使 ReadCollection 函数通用,这样我就可以调用它来读取不同的集合。该代码不会触发任何错误,但结果是一个空数组,即使接口objects肯定是一个包含元素的数组。
查看完整描述

1 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

以下代码可以运行:


func (fc *FirebaseClient) ReadCollection(collectionPath string, objects interface{}) error {

    ctx := context.Background()

    opt := option.WithCredentialsJSON([]byte(os.Getenv("FIREBASE_CREDENTIALS")))

    client, err := firestore.NewClient(ctx, os.Getenv("FIREBASE_PROJECT_ID"), opt)

    if err != nil {

        return err

    }

    defer client.Close()


    collectionRef := client.Collection(collectionPath)

    docs, err := collectionRef.DocumentRefs(ctx).GetAll()

    if err != nil {

        return err

    }

    log.Printf("Total documents: %i", len(docs))


    dest := reflect.ValueOf(objects).Elem()



    log.Printf("dest: %v", dest)

    for _, doc := range docs {

        docsnap, err := doc.Get(ctx)

        if err != nil {

            return err

        }


        obj := reflect.New(dest.Type().Elem())


        if err := docsnap.DataTo(obj.Interface()); err != nil {

            return err

        }

        log.Printf("obj: %v", obj)

        dest = reflect.Append(dest, obj.Elem())



    }


    reflect.ValueOf(objects).Elem().Set(dest)

    log.Printf("objects: %v", dest)

    return nil

}

    var ss []SomeStruct


    fc := new(insightech.FirebaseClient)

    if err := fc.ReadCollection("mycollection", &ss); err != nil {

        return

    }


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

添加回答

举报

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