From: Shenghou Ma Date: Thu, 17 Apr 2014 05:40:04 +0000 (-0400) Subject: doc/effective_go: mention that b.Write is a shorthand for (&b).Write when b is addres... X-Git-Tag: go1.3beta1~28 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f8f34c330c651b16ef8c54e60f4862b4a66b4a41;p=gostls13.git doc/effective_go: mention that b.Write is a shorthand for (&b).Write when b is addressable. The rewrite is due to Rob. LGTM=r, bradfitz, josharian R=golang-codereviews, bradfitz, r, josharian CC=golang-codereviews https://golang.org/cl/87410043 --- diff --git a/doc/effective_go.html b/doc/effective_go.html index ae04899e19..c522b9ffb7 100644 --- a/doc/effective_go.html +++ b/doc/effective_go.html @@ -2056,10 +2056,22 @@ We pass the address of a ByteSlice because only *ByteSlice satisfies io.Writer. The rule about pointers vs. values for receivers is that value methods can be invoked on pointers and values, but pointer methods can only be -invoked on pointers. This is because pointer methods can modify the -receiver; invoking them on a copy of the value would cause those -modifications to be discarded. +invoked on pointers.

+ +

+This rule arises because pointer methods can modify the receiver; invoking +them on a value would cause the method to receive a copy of the value, so +any modifications would be discarded. +The language therefore disallows this mistake. +There is a handy exception, though. When the value is addressable, the +language takes care of the common case of invoking a pointer method on a +value by inserting the address operator automatically. +In our example, the variable b is addressable, so we can call +its Write method with just b.Write. The compiler +will rewrite that to (&b).Write for us. +

+

By the way, the idea of using Write on a slice of bytes is central to the implementation of bytes.Buffer.