Golang Go语言中结构体内嵌接口的疑问

发布于 1周前 作者 vueper 来自 Go语言

Golang Go语言中结构体内嵌接口的疑问

func TestInterface(t *testing.T) {
type Reader interface {
Read()
}
type Cache struct {
Reader
}
c := Cache{}
c.Read()
}

以上代码会报空指针错误。

我的疑问是,有没有办法在编译的时候就能够主动的发现这个错误。

11 回复

结构体如果是实现接口,可以通过 var _ Reader = Cache{} 来发现。

内嵌只能通过 if c.Reader != nil 来判断了吧,编译器并不知道你在哪里赋值了。

更多关于Golang Go语言中结构体内嵌接口的疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


https://github.com/xxjwxc/uber_go_guide_cn

可以看看 uber 的 go 风格指南,我记得有写

内嵌 interface 的目的是啥

你这个
type Cache struct {
Reader
}
等于
type Cache struct {
Reader Reader
}

然后 Cache{} 初始化时,接口类型默认值是 nil,所以 Reader 是 nil

跟下面一个道理(指针类型的默认值是 nil )
type Cache Struct {
Something *int
}


所以,无解。通常写一个 NewCache() 方法生成可以避免。

var _ Reader = (*Cache)(nil)

不好意思,俺上面的写法是针对,实现接口的。你问题里面的是直接继承接口。
不过你可以不继承接口,然后使用下面的代码来实现

<br>func TestInterface(t *testing.T) {<br> type Reader interface {<br> Read()<br> }<br> type Cache struct {<br> }<br><br><br> var _ Reader = (*Cache)(nil)<br> c := Cache{}<br> c.Read()<br>}<br>

正解,不过即便写了 NewCache()也没法杜绝 SB 用户这么用🤦‍♂️

不能,所以不要把 interface 嵌入 struct

把 struct 匿名嵌套在 struct 也会出现这种情况

这个问题我怎么在哪见过啊

在Golang中,结构体内嵌接口是一种常见的编程模式,它允许你通过接口定义行为,然后在结构体中嵌入这些接口,从而实现多态性和代码的解耦。以下是对这一模式的一些解释和注意事项:

  1. 接口嵌入的意义: 将接口嵌入到结构体中,可以让该结构体隐式地实现接口中定义的所有方法。这样,你无需显式地声明结构体实现了某个接口,只要它提供了接口所需的所有方法即可。

  2. 如何使用: 定义一个接口,然后在结构体中嵌入这个接口。之后,你可以为结构体实现接口中的方法。这样做的好处是,你可以轻松地通过接口类型的变量来操作这些结构体,从而实现多态性。

  3. 注意事项

    • 嵌入接口并不会为结构体增加任何字段,它只是要求结构体实现接口中的方法。
    • 如果结构体嵌入了多个接口,并且这些接口有相同的方法名,那么结构体只需要实现一次这个方法即可。
    • 嵌入接口可能会增加代码的复杂性,特别是在处理多重继承和依赖关系时。因此,在设计时应谨慎使用。
  4. 实践建议: 在实际编程中,建议根据具体需求来决定是否使用接口嵌入。如果确实需要实现多态性或者解耦代码,那么接口嵌入是一个很好的选择。但也要注意保持代码的清晰和可维护性。

希望这些解释能帮助你更好地理解Golang中结构体内嵌接口的概念和用法。

回到顶部