var _ HelloInter = (*Cat)(nil)
type HelloInter interface {
Hello() string
}
type Cat struct {
HelloInter
name string
}
func (c *Cat) Hello() string {
return c.name + "miaomiao"
}
其中var _ HelloInter = (*Cat)(nil)
这行代码是啥意思呢?
var _ HelloInter = (*Cat)(nil)
type HelloInter interface {
Hello() string
}
type Cat struct {
HelloInter
name string
}
func (c *Cat) Hello() string {
return c.name + "miaomiao"
}
其中var _ HelloInter = (*Cat)(nil)
这行代码是啥意思呢?
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.4k 阅读
2 回答885 阅读✓ 已解决
2 回答2.2k 阅读
1 回答2.1k 阅读
先说下划线。
这是正常声明一个变量,
s
是变量名,string
是变量类型,等号后面是赋值。如果我们后面不需要访问这个变量、只是需要定义(常见于丢弃函数的返回值),那么就用下划线占位。
而原题等号后面的赋值就是一个普通的指针类型强转。
这句代码其实在运行时不起到任何作用,而是一种编译时的类型防守策略。如果你的
Cat
没有实现HelloInter
,那么这句代码在编译时就会报错,这样你就知道了这里的实现是有问题的,可能你修改了接口忘了同步修改其子类,结果等到运行时才能知道有问题就为时已晚。而之所以用下划线占位,就因为确实不需要访问这个变量,只需要看强转能不能编译通过。