【问题标题】:interface conversion panic when method is not actually missing当方法实际上没有丢失时接口转换恐慌
【发布时间】:2016-04-10 07:51:24
【问题描述】:

不知何故,在运行时,我收到以下 panic 消息,即使在我看来该方法已正确定义为实现该接口的结构。

panic: interface conversion: schema.MerchantResultset 
is not search.ResultsetInterface: missing method Add

这是界面蓝图

type ResultsetInterface interface {
    Init(string)
    CacheSet(context.Context) error
    CacheSetPart(context.Context, int) error
    CacheGet(context.Context, string) error
    Add(interface{})
    AddResultset(interface{})
}

下面是运行时报missing的方法,分配给我的struct MerchantResultset。

func (mr *MerchantResultset) Add(item interface{}) {
    mr.Data = append(mr.Data, item.(Merchant))
}

我不知何故非常困惑,试图了解这里实际需要什么

【问题讨论】:

  • 同意 Roland lllig 的回答。您的恐慌报告 schema.MerchantResultset 没有实现该方法,这是真的,因为 Add 方法具有指针接收器。你需要传递&MerchantResultset{},而不是MerchantResultset{}
  • 不知何故,这两个选项仍然会产生同样的恐慌:1) item := schema.Merchant{}; resultSet.Add(item) 2) item := schema.Merchant{};结果集.Add(&item)
  • 所以基本上这意味着唯一的实现者是 func (mr MerchantResultset) Add(item interface{}) ?
  • 您误会了,请看一下pointer receiver and non-pointer receiver 之间的区别以及如何初始化它们。基本上你需要做item := &schema.Merchant{} 让它实现接口。

标签: go


【解决方案1】:

可能是因为您传递了一个MerchantResultset,但Add 方法仅定义为指向该类型的指针

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多