我有一个关于包字节中Go指针用法的问题

我有一个关于包字节中Go指针用法的问题,go,Go,我有一个关于Go中指针用法的问题。链接位于此处: 在type Buffer部分中,第一个示例: type Buffer struct { // contains filtered or unexported fields } 然后在 func (b *Buffer) Write(p []byte) (n int, err error) 我知道func Write的接收者是(b*Buffer)那么为什么在main()函数中,在声明/初始化b之后,我们可以简单地使用b.Write()但是

我有一个关于Go中指针用法的问题。链接位于此处:

type Buffer
部分中,第一个示例:

type Buffer struct {
    // contains filtered or unexported fields
}
然后在

func (b *Buffer) Write(p []byte) (n int, err error)
我知道
func Write
的接收者是
(b*Buffer)
那么为什么在
main()
函数中,在声明/初始化
b
之后,我们可以简单地使用
b.Write()
但是不是
(&b).Write()


谢谢大家!

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

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

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

编译器可以自动获取地址并为您执行此操作。请参见中和结尾的
t.M2()
示例。这与包字节无关,但适用于每种类型。@Volker非常感谢。非常有用的链接。Go没有参考资料。编译器传递一个指向该值的指针。
bytes.Buffer{}.Write([]byte{1})