func TestInterface(t *testing.T) { type Reader interface { Read() } type Cache struct { Reader } c := Cache{} c.Read() } 以上代码会报空指针错误。
我的疑问是,有没有办法在编译的时候就能够主动的发现这个错误。

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