我想将struct方法作为函数值传递 . 如果函数需要返回接口{}并且返回* struct,为什么编译失败?如果我尝试从声明为返回接口{}(包装器函数)的函数返回* struct,它将完美地工作 .
package main
func main() {
println("hello")
testInterface(wrapper) // works
instance := MyStruct{}
testInterface(instance.works) // works
testInterface(instance.fails) // fails: ./main.go:8: cannot use instance.fails (type func(int) *MyStruct) as type func(int) interface {} in argument to testInterface
}
func testInterface(f func() interface{}) {
f()
return
}
type MyStruct struct {
}
func (s *MyStruct) works() interface{} {
return s
}
func (s *MyStruct) fails() *MyStruct {
return s
}
func wrapper() interface{} {
s := MyStruct{}
return s.fails()
}
1 回答
那是因为它不适合assignability标准
所以,这解释了为什么
testInterface(instance.fails)
失败:因为instance.fails
不能分配给f func() interface{}
.现在第二个问题:
它工作正常,因为
*struct
类型的值可分配给interface{}
类型,因为:此可分配性规则:“
T
是接口类型,x
实现T
. ”“类型实现包含其方法的任何子集的任何接口,因此可以实现几个不同的接口 . 例如, all types implement the empty interface :”(粗体是我的)
参考文献:
Type identity
Assignability
Interface types