-2

我有一个关于 Go 中指针用法的问题。链接在这里:https ://golang.org/pkg/bytes/#example_Buffer 。

在本type Buffer节中,第一个示例:

type Buffer struct {
    // contains filtered or unexported fields
}
func main() {
    var b bytes.Buffer // A Buffer needs no initialization.
    b.Write([]byte("Hello "))
    fmt.Fprintf(&b, "world!")
    b.WriteTo(os.Stdout)
}

然后在

func (b *Buffer) Write(p []byte) (n int, err error)

我知道接收者func Write(b *Buffer)为什么在main()函数中,在声明/初始化之后b,我们可以简单地使用b.Write()不是 (&b).Write()

谢谢!

4

1 回答 1

1

接收者是一个指针,在 b.Write() 中,b 是可寻址的。因此,Write 是在指向 b 的指针上调用的,而不是 b 的副本。如果 b 不可寻址,那么您将收到编译错误。例如,这将失败:

bytes.Buffer{}.Write([]byte{1})

一般来说:只有当您可以获取接收器对象的地址时,您才能使用指针接收器调用方法。编译器传递引用,而不是此类方法的副本。

于 2019-08-21T05:32:06.583 回答