Go 使用动态和静态绑定。根据我的理解,如果您需要使用类型断言,那么它是动态的。我想验证我的假设。
type Xer interface {
X()
}
type XYer interface {
Xer
Y()
}
type Foo struct{}
func (Foo) X() { println("Foo#X()") }
func (Foo) Y() { println("Foo#Y()") }
假设:
foo := Foo{}
// static: Foo -> XYer
var xy XYer = foo
// static: XYer -> Xer
var x Xer = xy
// static: Xer -> interface{}
var empty interface{} = x
// dynamic: interface{} -> XYer
xy2 := empty.(XYer)
// dynamic: XYer -> Foo
foo2 := xy2.(Foo)
因此,当从type A->转换时interface B,如果A满足B则不需要断言,并且可以在编译时生成 itable。如果您在不需要断言的情况下使用断言呢?
var x Xer = Foo{}
empty := x.(interface{})
在这种情况下会发生什么?如果有人可以为我澄清这一点,那就太好了。
明月笑刀无情
相关分类