问题:
在 Go 中,我有一个结构体实现接口的包。在另一个依赖包中,我想创建此结构的假实现以用于测试目的。然而,当我尝试分配一个返回实现该接口的变量的接口的结构的函数时,Go 会抱怨类型安全。
架构:
// Package expensive type myStruct struct{} func (m *myStruct) DoSomething() {...} func (m *myStruct) DoSomethingElse() {...} func CreateInstance() *myStruct {...} // Expensive to call // Package main type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() {...}
错误:
“无法使用昂贵的.CreateInstance(类型 func() *expense.myStruct) as type func() myInterface in field value"
答案:
出现此问题是因为 CreateInstance 函数返回一个 *myStruct 值,该值与来自factoryFunction 所需的func() myInterface 类型。要解决此问题:
// Package main type myInterface interface { DoSomething() } type myStruct struct{} func (m *myStruct) DoSomething() {...} func getInstance() myInterface { return &myStruct{} }
通过此修改,getInstance 现在返回 myInterface 类型,允许将其分配给factoryFunction。
附加说明:
wrapper := func() myInterface { return expensive.CreateInstance() }
以上是如何分配一个返回结构体的函数来实现 Go 中的接口?的详细内容。更多信息请关注PHP中文网其他相关文章!