关于 struct 实现 interface 的问题
来源:1-9 神奇的内置数据结构
EwdAger
2021-07-14 23:59:32
目前看了源码和很多资料得出了以下结论,但感觉好像有点怪怪的。麻烦曹大纠错一下~
判断一个 struct 是否实现了 interface,在编译阶段会 Go 语言内部会隐式的进行转换工作。而这个转换工作是跟显式的接口转换类似,调用 runtime.convI2I()
方法。把这个 struct 的 _type
赋值给了 iface.itab
内的 _type
。然后比较 iface.interfacetype.imethod
和 iface.func
。
1回答
助教_小R
2021-07-24
你上面给的函数应该是在运行阶段做的,不是编译阶段。编译阶段的话 grep 一下:
find ./ -name "*.go" | xargs grep "does not implement" | grep "(missing"
就会知道,判断逻辑是在 `cmd/compile/internal/gc/subr.go` 这个里面。
给一个例子:
```go
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{}
}
```
编译它,会报错,根据报错信息,就可以找到具体的源码,再去分析下。
```sh
# command-line-arguments
./a.go:15:9: cannot use (*myWriter)(nil) (type *myWriter) as type io.Writer in assignment:
*myWriter does not implement io.Writer (missing Write method)
./a.go:18:9: cannot use myWriter literal (type myWriter) as type io.Writer in assignment:
myWriter does not implement io.Writer (missing Write method)
```
相似问题