登录
首页 >  Golang >  Go问答

如何使 gqlgen dataloader Loader.Load(key) 返回一个具体数据类型而不是 interface{} 的函数实现?

来源:stackoverflow

时间:2024-02-08 22:33:24 359浏览 收藏

今天golang学习网给大家带来了《如何使 gqlgen dataloader Loader.Load(key) 返回一个具体数据类型而不是 interface{} 的函数实现?》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我想使用 graph-gophers/dataloader 为批量获取用户实现数据加载器。

我已按如下方式实现它,但我需要返回显式数据类型,而不是 interface{}

首先,我通过给定的 dataloader.keys 使用函数 getusers 创建 userreader

type userreader struct {
    userctrl user.controller // this is my user service for create, get, delete user
}

func newuserreader(userctrl user.controller) userreader {
    return userreader{
        userctrl: userctrl,
    }
}

// getusers return a list of result by given keys
func (reader userreader) getusers(ctx context.context, keys dataloader.keys) []*dataloader.result {
    output := make([]*dataloader.result, len(keys))
    for i, key := range keys {
        userid := key.string()
        
        // get list of user by string userid
        result, err := reader.userctrl.getusers(ctx, userid)
        output[i] = &dataloader.result{data: result, error: err}
    }

    return output
}

然后,我使用函数 getuser 创建一个 loader 来通过 userid 获取用户,它不会在单个请求中向 userctrl 请求数据超过 1 次。

type loader struct {
    userloader *dataloader.loader
}

func newloader(userctrl user.controller) loader {
    userreader := newuserreader(userctrl)
    return loader{
        // create new user loader with batch function
        userloader: dataloader.newbatchedloader(userreader.getusers),
    }
}

// userloader returns the user loader
func (loader loader) userloader() *dataloader.loader {
    return loader.userloader
}

// getuser return a user by given parameter
func (loader impl) getuser(ctx context.context, userid string) (model.user, error) {
    // fromctx gets a loader from context if it exists, else nil.
    ctxloader := fromctx(ctx)
    
    // thunk is function return value with interface{} type and error
    thunk := ctxloader.userloader().load(ctx, dataloader.stringkey(userid))
    result, err := thunk()
    if err != nil {
        return nil, err
    }
    return result.(model.user), nil // convert datatype here!!!
}

最后,可以使用了

dataloader.FromCtx(ctx).GetUser(ctx, userID)

但我需要 userreader.getusers 返回包含 model.user 而不是 interface{} 的对象,因为我不想在 loader.getuser 函数中转换数据类型。

有没有办法让 dataloader.result 返回某种数据类型而不是 interface{}


正确答案


graph-gophers/dataloaderv7 版本支持泛型。具体来说,BatchFunc signature 已更改,因此您可以指定结果类型。

理论要掌握,实操不能落!以上关于《如何使 gqlgen dataloader Loader.Load(key) 返回一个具体数据类型而不是 interface{} 的函数实现?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>