关于 struct 实现 interface 的问题

来源:1-9 神奇的内置数据结构

EwdAger

2021-07-14 23:59:32

目前看了源码和很多资料得出了以下结论,但感觉好像有点怪怪的。麻烦曹大纠错一下~

判断一个 struct 是否实现了 interface,在编译阶段会 Go 语言内部会隐式的进行转换工作。而这个转换工作是跟显式的接口转换类似,调用 runtime.convI2I() 方法。把这个 struct 的 _type 赋值给了 iface.itab 内的 _type。然后比较 iface.interfacetype.imethodiface.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)

```

0

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程