Go使用動態和靜態綁定。從我的理解,如果你需要使用類型斷言,那麼它是動態的。我想驗證我的假設。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{})
在這種情況下會發生什麼情況?如果有人能爲我澄清這很好。
爲什麼不看看它輸出的組件呢? – cthom06 2013-04-11 15:31:07
@ cthom06因爲我太笨了。 – 2013-04-11 15:35:24
[另請參閱](http://research.swtch.com/interfaces)。 – kostix 2013-04-12 08:05:12