Go 中的指针与值接收器

问题描述 投票:0回答:0

我在 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)

谁能解释一下到底发生了什么?为什么结构体和接口的行为不同?

go pointers struct interface
© www.soinside.com 2019 - 2024. All rights reserved.