var _ 接口 = (*结构体)(nil)的作用
package main
import (
"fmt"
)
type person interface {
getName() string
}
type stu struct {
name string
}
func (s *stu) getName() string {
return s.name
}
/* jason-comment
*stu does not implement person (missing getName method)
// 如果:stu不实现这个方法,则会报错,stu没实现这个接口,但teacher不会,因为main里没有用它,(如何确保teacher在编译时检查,该结构体,实现了person接口呢
*/
type teacher struct {
name string
}
func (t teacher) getName() string {
return t.name
}
var _ person = (*stu)(nil)
var _ person = (*teacher)(nil) // 该句确保!teacher在编译期间检查,确保teacher必须实现了person接口才行,否则编译不通过!(在teacher没有被main函数中使用的情况下 )
// 先把nil转为*teacher类型,然后把*teacher强制转换为person接口类型,(如果转换失败,说明*teacher类型不能转为person接口类型,说明teacher没有完全实现该接口的方法)!
func main() {
var p person = &stu{ // 这里是对stu强制类型转换了,转为了person接口
name: "wanghandsome",
}
fmt.Println(p.getName())
tmp := p.(*stu)
fmt.Println(tmp.name) // 需要将接口类型的p,转为具体的*stu实例,才可以访问stu的name字段!
// fmt.Println(p.name) // .\interface-main.go:41:15: p.name undefined (type person has no field or method name)
}