为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
偶然的你 2021-12-07 10:12:18
我正在学习 Go,并且遇到了在 Go 中将接口嵌入到结构中的情况。我理解接口及其实现的乐趣,但我对当前执行将接口嵌入结构中的原因感到困惑。当我在结构中嵌入一个接口时,该结构获得了接口的方法集,现在可以用作接口类型变量的值,例如:type Foo interface {  SetBaz(baz)   GetBaz() baz}type Bar struct {  Foo}所以现在我们有一个 struct 类型Bar,它嵌入了Foo. 因为Barembeds Foo,Bar现在满足任何需要 type 的接收器或参数Foo,即使甚至Bar没有定义它们。尝试调用Bar.GetBaz()会导致运行时错误:panic: runtime error: invalid memory address or nil pointer dereference。为什么 Go 在嵌入接口的结构上定义 nil 方法,而不是明确要求通过编译器定义这些方法?
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

你错了nil方法,它的interface嵌入struct Bar是nil。当你使用接口的方法时,就是调用这个接口。这个技巧允许你用我们自己的方法覆盖一个接口方法。


要了解嵌入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}

}


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信