为什么在结构中嵌入接口导致接口方法集被定义为nil指针?

时间:2016-01-12 21:35:27

标签: go

我正在学习Go,我在Go中将接口嵌入到结构中。

我理解接口及其实现的乐趣,但我很困惑当前执行在结构中嵌入一个的原因。

当我在struct中嵌入一个接口时,struct获得了Interface的方法集,现在可以用作Interface类型变量的值,例如:

type Foo interface {
  SetBaz(baz) 
  GetBaz() baz
}

type Bar struct {
  Foo
}

现在我们有一个嵌入Bar的结构类型Foo。由于Bar嵌入FooBar现在可以满足任何需要类型Foo的接收者或参数,即使Bar甚至没有定义它们。

尝试调用Bar.GetBaz()会导致运行时错误:panic: runtime error: invalid memory address or nil pointer dereference

为什么Go在嵌入接口的结构上定义nil方法,而不是明确要求通过编译器定义这些方法?

1 个答案:

答案 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}
}