Go 中的接口实现:返回结构体的函数类型
在使用 Go 时,经常会遇到函数返回结构体的情况实现一个接口。但是,当尝试将函数分配给需要接口实例的字段时,您可能会遇到类似于“无法在字段值中使用 [函数] 作为类型 [接口]”的错误。
要理解这一点错误,澄清返回结构体指针 (struct) 的函数不会自动实现为该结构体定义的接口是至关重要的。换句话说,struct 和 struct 在 Go 中是不同的类型。
在给定的示例中,函数 getInstance 预计返回 myInterface,这是行为(接口)的描述而不是具体的实现(结构体)。然而,getInstance返回一个指向myStruct实现(*myStruct)的指针,它与myInterface类型不兼容。
要解决这个问题,你需要修改getInstance 返回一个实例myStruct 结构体,如下面更正后的代码所示:
package main import "fmt" func main() { var function func() myInterface function = getInstance newSomething := function() newSomething.doSomething() } type myInterface interface { doSomething() } type myStruct struct{} func (m *myStruct) doSomething() { fmt.Println("doing something") } func getInstance() myInterface { return &myStruct{} }
myStruct 实现 myInterface 接口,并且getInstance 函数返回正确的type.
虽然上述方法有效,但 Go 提出了一项语言更改,如果具体类型实现了接口,则自动将返回具体类型的函数转换为返回接口的函数。然而,由于潜在的性能和安全问题,该提案被拒绝。以上是为什么返回结构体指针的 Go 函数不自动实现接口?的详细内容。更多信息请关注PHP中文网其他相关文章!