我对包字节中的Go指针使用有疑问

I have a question about a usage of pointer in Go. The link is here: https://golang.org/pkg/bytes/#example_Buffer.

In the type Buffer section, the first example:

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)
}

and then in the

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

I know that the receiver of func Write is (b *Buffer) then why in the main() function, after declaring/initializing b, we can simply use b.Write() but not (&b).Write()?

Thank you!

The receiver is a pointer, and in b.Write(), b is addressable. So Write is invoked on a pointer to b, not a copy of b. If b was not addressable, then you'd have received a compile error. For instance, this would fail:

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

In general: you can call methods with pointer receivers only if you can take the address of the receiver object. The compiler passes the reference, not the copy for such methods.