不能使用提供程序作为 type []*versioner。提供程序在字段值中响应

我有以下无法编译的代码片段:


func (r *ProviderServer) ListProvider(ctx context.Context, in *emptypb.Empty) (*versioner.ListProvidersResponse, error) {


    providers, err := r.store.FindAll()

    return &versioner.ListProvidersResponse{Providers: providers}, err


}

编译器抱怨:


cannot use providers (type *[]versioner.ProviderResponse) as type []*versioner.ProviderResponse in field value

的定义如下:ListProviderResponse


type ProviderResponse struct {

    state         protoimpl.MessageState

    sizeCache     protoimpl.SizeCache

    unknownFields protoimpl.UnknownFields


    Name        string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`

    Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`

}


type ListProvidersResponse struct {

    state         protoimpl.MessageState

    sizeCache     protoimpl.SizeCache

    unknownFields protoimpl.UnknownFields


    Providers []*ProviderResponse `protobuf:"bytes,1,rep,name=providers,proto3" json:"providers,omitempty"`

}

和 :r.store.FindAll()


type ProviderStore interface {

    FindAll() (*[]versioner.ProviderResponse, error)

    ...

}

我做错了什么?


千巷猫影
浏览 60回答 1
1回答

慕森卡

您的存储方法返回一个,它是指向值切片的指针。*[]versioner.ProviderResponseversioner.ProviderResponse您正在尝试将 具有上述类型的 分配给声明为 的结构字段,该字段是指向 的指针切片。providers[]*ProviderResponseversioner.ProviderResponse类型不匹配,编译器会告诉您这一点。如果这只是一个拼写错误,那么这是一个简单的修复。如果您无法完全控制其中一些源代码(或者如果类型完全按照它们必须的方式声明),则只需将存储结果重新映射到结构字段:providers, err := r.store.FindAll()if err != nil {   // }if providers == nil {   // must check this, since you want to dereference}res := make([]*versioner.ProviderResponse, len(*providers))for i, v := range *providers {    v2 := v    res[i] = &v2 // don't address the loop variable}return &versioner.ListProvidersResponse{    Providers: res, // now assigning the correct type}, err为什么你不想解决循环变量(tl;dr,因为它被重用了)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go