333 字
2 分钟
编译器自动检测类型是否实现接口 - Golang
经常看到一些开源库里会有一些类似下面这种奇怪的用法:
var _ io.Writer = (*myWriter)(nil)这时候会有点懵,不知道作者想要干什么,实际上这就是此问题的答案。编译器会由此检查 *myWriter 类型是否实现了 io.Writer 接口。
来看一个例子:
package main
import "io"
type myWriter struct {
}
/*func (w myWriter) Write(p []byte) (n int, err error) { return}*/
func main() { // 检查 *myWriter 类型是否实现了 io.Writer 接口 var _ io.Writer = (*myWriter)(nil)
// 检查 myWriter 类型是否实现了 io.Writer 接口 var _ io.Writer = myWriter{}}注释掉为 myWriter 定义的 Write 函数后,运行程序:
src/main.go:14:6: cannot use (*myWriter)(nil) (type *myWriter) as type io.Writer in assignment: *myWriter does not implement io.Writer (missing Write method)src/main.go:15:6: cannot use myWriter literal (type myWriter) as type io.Writer in assignment: myWriter does not implement io.Writer (missing Write method)报错信息:*myWriter/myWriter 未实现 io.Writer 接口,也就是未实现 Write 方法。
解除注释后,运行程序不报错。
实际上,上述赋值语句会发生隐式地类型转换,在转换的过程中,编译器会检测等号右边的类型是否实现了等号左边接口所规定的函数。
总结一下,可通过在代码中添加类似如下的代码,用来检测类型是否实现了接口:
var _ io.Writer = (*myWriter)(nil)var _ io.Writer = myWriter{} 编译器自动检测类型是否实现接口 - Golang
https://blog.zhequtao.com/posts/golang/go-questions/interface/编译器自动检测类型是否实现接口/ 相关阅读
本主题其他内容
Go 原理与面试问答
本主题共 67 篇 ·
Go 语言 专题 →
深入 Go runtime 源码:GMP 调度器工作机制、map 扩容与渐进式迁移、channel 收发与阻塞唤醒、interface 底层结构与类型断言、反射原理与 GC 三色标记,逐一拆解高频面试考点。