Go 不将 func 识别为有效接口
Posted
技术标签:
【中文标题】Go 不将 func 识别为有效接口【英文标题】:Go does not recognize a func as a valid interface 【发布时间】:2021-12-21 11:46:15 【问题描述】:我有这个功能
func(context.Context, *domain.Scorecard) (*domain.Scorecard, error)
我想将其作为接收接口的参数传递
warehouse interface
Get(context.Context, *domain.Scorecard) (*domain.Scorecard, error)
例如:
warehouseMock :=
usecase.WithScenarioFinder(
func(player *domain.Player) (*domain.Scenario, error)
return nil,nil
)
传统的形式是创建一个具有Get方法的结构,但我很好奇是否存在告诉“嘿,这是一个简单的函数,是同一家公司(没有名字),接受它”的方式
【问题讨论】:
是的,如果你定义一个命名的函数类型并在它上面定义一个调用函数的方法。见pkg.go.dev/net/http#HandlerFunc 没有定义方法,没有。接口定义方法,而不是函数,因此它们只能由具有给定名称和签名的方法来满足。 没有没有办法说“嘿,那是一个简单的func,是同一家公司(没有名字),接受它”带有一个func,其类型有没有名字。 【参考方案1】:函数不实现仅具有相同签名的单个方法的接口。有关该主题的讨论,请参阅 this Go issue。
创建适配器类型以将函数转换为接口:
type WarehouseFunc func(context.Context, *domain.Scorecard) (*domain.Scorecard, error)
func (f WarehouseFunc) Get(c context.Context, d *domain.Scorecard) (*domain.Scorecard, error)
return f(c, d)
将匿名函数转换成这样的接口:
itf = WarehouseFunc(func(c context.Context, d *domain.Scorecard) (*domain.Scorecard, error)
return nil, nil
)
【讨论】:
以上是关于Go 不将 func 识别为有效接口的主要内容,如果未能解决你的问题,请参考以下文章
术语“go”不被识别为cmdlet,函数,脚本文件或可操作程序的名称