Golang—检查接口是否实现

3,215 阅读1分钟

我们如何检查某个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()   {}