错误的类型接口实现
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
我做错了什么?
修改 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)
}
我正在尝试按照 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
我做错了什么?
修改 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)
}