我正在学习Go,我在Go中将接口嵌入到结构中。
我理解接口及其实现的乐趣,但我很困惑当前执行在结构中嵌入一个的原因。
当我在struct中嵌入一个接口时,struct获得了Interface的方法集,现在可以用作Interface类型变量的值,例如:
type Foo interface {
SetBaz(baz)
GetBaz() baz
}
type Bar struct {
Foo
}
现在我们有一个嵌入Bar
的结构类型Foo
。由于Bar
嵌入Foo
,Bar
现在可以满足任何需要类型Foo
的接收者或参数,即使Bar
甚至没有定义它们。
尝试调用Bar.GetBaz()
会导致运行时错误:panic: runtime error: invalid memory address or nil pointer dereference
。
为什么Go在嵌入接口的结构上定义nil方法,而不是明确要求通过编译器定义这些方法?
答案 0 :(得分:4)
您对nil
方法有误,它是interface
嵌入struct Bar
nil
的{{1}}。
当您使用接口的方法时,即调用此接口。这个技巧允许你用我们自己的方法覆盖一个接口方法。
要了解将interfaces
嵌入struct
的用法和目标,最佳示例位于sort
包中:
type reverse struct {
// This embedded Interface permits Reverse to use the methods of
// another Interface implementation.
Interface
}
// Less returns the opposite of the embedded implementation's Less method.
func (r reverse) Less(i, j int) bool {
return r.Interface.Less(j, i)
}
// Reverse returns the reverse order for data.
func Reverse(data Interface) Interface {
return &reverse{data}
}