使用go的结构指针作为接口

loading...


1

我想将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回答

  • 4

    那是因为它不适合assignability标准

    在任何这些情况下,值x都可分配给T类型的变量(“x可赋予T”):x的类型与T. x的类型V相同,T具有相同的基础类型,并且至少有一个V或者T不是命名类型 . T是接口类型,x实现T.x是双向通道值,T是通道类型,x的类型V和T具有相同的元素类型,并且V或T中的至少一个不是命名类型 . x是预先声明的标识符nil,T是指针,函数,切片,映射,通道或接口类型 . x是一个无类型常量,可由类型T的值表示 .

    所以,这解释了为什么 testInterface(instance.fails) 失败:因为 instance.fails 不能分配给 f func() interface{} .

    现在第二个问题:

    如果我尝试从声明为返回接口{}(包装器函数)的函数返回* struct,那么它非常有效 .

    它工作正常,因为 *struct 类型的值可分配给 interface{} 类型,因为:

    • 此可分配性规则:“ T 是接口类型, x 实现 T . ”

    • “类型实现包含其方法的任何子集的任何接口,因此可以实现几个不同的接口 . 例如, all types implement the empty interface :”(粗体是我的)

    参考文献:

loading...

评论

暂时没有评论!