错误的类型接口实现

Wrong type interface implementation

我正在尝试按照 Prisma's 指南设置 GraphQL Go 服务器。

Resolver.go

package main

import (
    "context"
    "prismago/hello-world/generated/prisma-client"
)

// Resolver struct
type Resolver struct {
    Prisma *prisma.Client
}

// Mutation MutationResolver
func (r *Resolver) Mutation() MutationResolver {
    return &mutationResolver{r}
}

// Post PostResolver
func (r *Resolver) Post() PostResolver {
    return &postResolver{r}
}

// Query QueryResolver
func (r *Resolver) Query() QueryResolver {
    return &queryResolver{r}
}

// User UserResolver
func (r *Resolver) User() UserResolver {
    return &userResolver{r}
}

type mutationResolver struct{ *Resolver }

func (r *mutationResolver) CreateUser(ctx context.Context, name string) (*prisma.User, error) {
    return r.Prisma.CreateUser(prisma.UserCreateInput{
        Name: name,
    }).Exec(ctx)
}
func (r *mutationResolver) CreateDraft(ctx context.Context, title string, userID string) (*prisma.Post, error) {
    return r.Prisma.CreatePost(prisma.PostCreateInput{
        Title: title,
        Author: &prisma.UserCreateOneWithoutPostsInput{
            Connect: &prisma.UserWhereUniqueInput{ID: &userID},
        },
    }).Exec(ctx)
}
func (r *mutationResolver) Publish(ctx context.Context, postID string) (*prisma.Post, error) {
    published := true
    return r.Prisma.UpdatePost(prisma.PostUpdateParams{
        Where: prisma.PostWhereUniqueInput{ID: &postID},
        Data:  prisma.PostUpdateInput{Published: &published},
    }).Exec(ctx)
}

type postResolver struct{ *Resolver }

func (r *postResolver) Author(ctx context.Context, obj *prisma.Post) (*prisma.User, error) {
    return r.Prisma.Post(prisma.PostWhereUniqueInput{ID: &obj.ID}).Author().Exec(ctx)
}

type queryResolver struct{ *Resolver }

func (r *queryResolver) PublishedPosts(ctx context.Context) ([]prisma.Post, error) {
    published := true
    return r.Prisma.Posts(&prisma.PostsParams{
        Where: &prisma.PostWhereInput{Published: &published},
    }).Exec(ctx)
}
func (r *queryResolver) Post(ctx context.Context, postID string) (*prisma.Post, error) {
    return r.Prisma.Post(prisma.PostWhereUniqueInput{ID: &postID}).Exec(ctx)
}
func (r *queryResolver) PostsByUser(ctx context.Context, userID string) ([]prisma.Post, error) {
    return r.Prisma.Posts(&prisma.PostsParams{
        Where: &prisma.PostWhereInput{
            Author: &prisma.UserWhereInput{
                ID: &userID,
            }},
    }).Exec(ctx)
}
func (r *queryResolver) Users(ctx context.Context) ([]prisma.User, error) {
    return r.Prisma.Users(&prisma.UsersParams{
        Where: &prisma.UserWhereInput{},
    }).Exec(ctx)
}

type userResolver struct{ *Resolver }

func (r *userResolver) Posts(ctx context.Context, obj *prisma.User) ([]prisma.Post, error) {
    return r.Prisma.User(prisma.UserWhereUniqueInput{ID: &obj.ID}).Posts(nil).Exec(ctx)
}

运行 go run ./server 生成以下错误:

cannot use &userResolver literal (type *userResolver) as type UserResolver in return argument:
        *userResolver does not implement UserResolver (wrong type for Posts method)
                have Posts(context.Context, *"prismago/hello-world/generated/prisma-client".User) ([]"prismago/hello-world/generated/prisma-client".Post, error)
                want Posts(context.Context, *"prismago/hello-world/generated/prisma-client".User) ([]*"prismago/hello-world/generated/prisma-client".Post, error)

我尝试修复类型错误:

func (r *userResolver) Posts(ctx context.Context, obj *prisma.User) ([]*prisma.Post, error) {
    return r.Prisma.User(prisma.UserWhereUniqueInput{ID: &obj.ID}).Posts(nil).Exec(ctx)
}

错误:

cannot use []"prismago/hello-world/generated/prisma-client".Post as type []*"prismago/hello-world/generated/prisma-client".Post in return argument

我做错了什么?

相关问题:https://github.com/99designs/gqlgen/issues/714

修改 generated.go 文件接口以接受 []prisma.Post 的 return 而不是 []*prisma.Post.

变化:

type UserResolver interface {
    Posts(ctx context.Context, obj *prisma.User) ([]*prisma.Post, error)
}

收件人:

type UserResolver interface {
    Posts(ctx context.Context, obj *prisma.User) ([]prisma.Post, error)
}