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{})
この場合はどうなりますか?誰かが私のためにこれを明確にすることができれば、それは素晴らしいことです.