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)
当从类型A
转换为接口B
时,如果A
满足B
,则不需要断言并且itable可以在编译时生成。那么在不需要断言的情况下使用断言的情况怎么处理:
var x Xer = Foo{}
empty := x.(interface{})
在这种情况下会发生什么?如果有人能为我澄清一下,那就太好了。