我们如何检查某个struct是否实现interface呢?
因为golang里的接口实现不是侵入式,所以很多时候,我们使用某些接口时候并不知道是否实现了哪些接口; 阅读Golang项目源码经常能看到类似以下的代码,例如gin框架response_writer.go文件
var _ ResponseWriter = &responseWriter{}
一般我们可以定义一个接口类型变量,然后通过结构体进行赋值,这样我们就可以在编译的时候知道是否实现了自己想要的接口;因为无用变量会浪费空间,所以可以一般使用"_",来丢弃无用变量。
案例
源码
type User interface {
Writer()
Read()
}
type Student struct {
}
// 使用声明方式
var _ User = &Student{}
// 类型转换方式
var _ User = (*Student)(nil)
错误提示
type Student struct {
}
Basics.Student on pkg.go.dev
cannot use &(Student literal) (value of type *Student) as User value in variable declaration: missing method Readcompiler
当我们实现接口时,编译错误的提示就消失了
func (u Student) Writer() {}
func (u Student) Read() {}