func TestInterface(t *testing.T) {
type Reader interface {
Read()
}
type Cache struct {
Reader
}
c := Cache{}
c.Read()
}
以上代码会报空指针错误。
我的疑问是,有没有办法在编译的时候就能够主动的发现这个错误。
1
baiyi 2021 年 3 月 19 日
结构体如果是实现接口,可以通过 var _ Reader = Cache{} 来发现。
内嵌只能通过 if c.Reader != nil 来判断了吧,编译器并不知道你在哪里赋值了。 |
2
hwdef 2021 年 3 月 19 日
|
3
Mark3K 2021 年 3 月 19 日
内嵌 interface 的目的是啥
|
4
rrfeng 2021 年 3 月 19 日
你这个
type Cache struct { Reader } 等于 type Cache struct { Reader Reader } 然后 Cache{} 初始化时,接口类型默认值是 nil,所以 Reader 是 nil 跟下面一个道理(指针类型的默认值是 nil ) type Cache Struct { Something *int } 所以,无解。通常写一个 NewCache() 方法生成可以避免。 |
5
kele1997 2021 年 3 月 19 日
`var _ Reader = (*Cache)(nil)`
|
6
kele1997 2021 年 3 月 19 日
不好意思,俺上面的写法是针对,实现接口的。你问题里面的是直接继承接口。
不过你可以不继承接口,然后使用下面的代码来实现 ``` func TestInterface(t *testing.T) { type Reader interface { Read() } type Cache struct { } var _ Reader = (*Cache)(nil) c := Cache{} c.Read() } ``` |
8
nuk 2021 年 3 月 19 日
不能,所以不要把 interface 嵌入 struct
|
9
fenghuang 2021 年 3 月 19 日
把 struct 匿名嵌套在 struct 也会出现这种情况
|
10
asLw0P981N0M0TCC 2021 年 3 月 20 日
这个问题我怎么在哪见过啊
|