1
0
mirror of https://github.com/golang/go synced 2024-11-21 18:24:46 -07:00

go spec: clarify promotion rules for methods/fields of anonymous fields

Fixes #3635.

R=rsc, r, iant, kevlar, iant
CC=golang-dev
https://golang.org/cl/6217045
This commit is contained in:
Robert Griesemer 2012-06-04 14:24:10 -07:00
parent 25922c0658
commit 787adb6eb3

View File

@ -1,6 +1,6 @@
<!--{ <!--{
"Title": "The Go Programming Language Specification", "Title": "The Go Programming Language Specification",
"Subtitle": "Version of May 24, 2012", "Subtitle": "Version of June 4, 2012",
"Path": "/ref/spec" "Path": "/ref/spec"
}--> }-->
@ -684,6 +684,8 @@ consists of all methods with receiver type <code>T</code>.
The method set of the corresponding pointer type <code>*T</code> The method set of the corresponding pointer type <code>*T</code>
is the set of all methods with receiver <code>*T</code> or <code>T</code> is the set of all methods with receiver <code>*T</code> or <code>T</code>
(that is, it also contains the method set of <code>T</code>). (that is, it also contains the method set of <code>T</code>).
Further rules apply to structs containing anonymous fields, as described
in the section on <a href="#Struct_types">struct types</a>.
Any other type has an empty method set. Any other type has an empty method set.
In a method set, each method must have a In a method set, each method must have a
<a href="#Uniqueness_of_identifiers">unique</a> <a href="#MethodName">method name</a>. <a href="#Uniqueness_of_identifiers">unique</a> <a href="#MethodName">method name</a>.
@ -955,28 +957,39 @@ struct {
</pre> </pre>
<p> <p>
Fields and methods (§<a href="#Method_declarations">Method declarations</a>) of an anonymous field are A field or <a href="#Method_declarations">method</a> <code>f</code> of an
promoted to be ordinary fields and methods of the struct (§<a href="#Selectors">Selectors</a>). anonymous field in a struct <code>x</code> is called <i>promoted</i> if
The following rules apply for a struct type <code>S</code> and <code>x.f</code> is a legal <a href="#Selectors">selector</a> that denotes
a type named <code>T</code>: that field or method <code>f</code>.
</p>
<p>
Promoted fields act like ordinary fields
of a struct except that they cannot be used as field names in
<a href="#Composite_literals">composite literals</a> of the struct.
</p>
<p>
Given a struct type <code>S</code> and a type named <code>T</code>,
promoted methods are included in the method set of the struct as follows:
</p> </p>
<ul> <ul>
<li>If <code>S</code> contains an anonymous field <code>T</code>, the <li>
<a href="#Method_sets">method set</a> of <code>S</code> includes the If <code>S</code> contains an anonymous field <code>T</code>,
method set of <code>T</code>. the <a href="#Method_sets">method sets</a> of <code>S</code>
and <code>*S</code> both include promoted methods with receiver
<code>T</code>. The method set of <code>*S</code> also
includes promoted methods with receiver <code>*T</code>.
</li> </li>
<li>If <code>S</code> contains an anonymous field <code>*T</code>, the <li>
method set of <code>S</code> includes the method set of <code>*T</code> If <code>S</code> contains an anonymous field <code>*T</code>,
(which itself includes the method set of <code>T</code>). the method sets of <code>S</code> and <code>*S</code> both
</li> include promoted methods with receiver <code>T</code> or
<code>*T</code>.
<li>If <code>S</code> contains an anonymous field <code>T</code> or
<code>*T</code>, the method set of <code>*S</code> includes the
method set of <code>*T</code> (which itself includes the method
set of <code>T</code>).
</li> </li>
</ul> </ul>
<p> <p>
A field declaration may be followed by an optional string literal <i>tag</i>, A field declaration may be followed by an optional string literal <i>tag</i>,
which becomes an attribute for all the fields in the corresponding which becomes an attribute for all the fields in the corresponding