我在 Go 中遇到了一个相当奇怪的情况。考虑下面的代码:
type reader struct {
finished bool
}
func (r *reader) Read() {
fmt.Println("reading...")
r.finished = true
}
func main() {
r := reader{} // notice that r is not a pointer to a reader struct
r.Read() // works just fine
fmt.Println(r.finished) // true
}
我对上面代码的看法是方法
func (r *reader) Read() {...}
与
相同func Read(r *reader) {...}
所以当我在非指针
.Read()
类型中调用 reader
方法时,go 会自动执行如下操作:
r := reader{}
(&r).Read() // something like Read(&r)
如果我错了,请纠正我,因为这只是我的推论。
但我真正的问题是,如果我尝试声明
Reader
接口类型,具体类型为 reader
,具体值是 reader
结构的实例,为什么相同的场景不起作用,如下所示:
type Reader interface {
Read()
}
type reader struct {
finished bool
}
func (r *reader) Read() {...}
func main() {
var r Reader = reader{} // compile error
r.Read()
}
上面的编译错误指出:
cannot use reader{} (value of type reader) as Reader value in variable declaration: reader does not implement Reader (method Read has pointer receiver)
谁能解释一下到底发生了什么?为什么结构体和接口的行为不同?