mirror of
https://github.com/golang/go
synced 2024-11-25 07:17:56 -07:00
- Clarify that struct composite literal keys are field names not selectors.
- Slight re-phrasing of struct type section since "field name" was not properly introduced. Fixes #164. R=r, rsc, iant https://golang.org/cl/155061
This commit is contained in:
parent
0660d243b1
commit
d3b1565716
@ -694,16 +694,18 @@ new([100]int)[0:50]
|
|||||||
<h3 id="Struct_types">Struct types</h3>
|
<h3 id="Struct_types">Struct types</h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
A struct is a sequence of named
|
A struct is a sequence of named elements, called fields, each of which has a
|
||||||
elements, called fields, with various types. A struct type declares
|
name and a type. Field names may be specified explicitly (IdentifierList) or
|
||||||
an identifier and type for each field. Within a struct, non-<a href="#Blank_identifier">blank</a>
|
implicitly (AnonymousField).
|
||||||
field identifiers must be unique.
|
Within a struct, non-<a href="#Blank_identifier">blank</a> field names must
|
||||||
|
be unique.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre class="ebnf">
|
<pre class="ebnf">
|
||||||
StructType = "struct" "{" [ FieldDeclList ] "}" .
|
StructType = "struct" "{" [ FieldDeclList ] "}" .
|
||||||
FieldDeclList = FieldDecl { ";" FieldDecl } [ ";" ] .
|
FieldDeclList = FieldDecl { ";" FieldDecl } [ ";" ] .
|
||||||
FieldDecl = (IdentifierList Type | [ "*" ] TypeName) [ Tag ] .
|
FieldDecl = (IdentifierList Type | AnonymousField) [ Tag ] .
|
||||||
|
AnonymousField = [ "*" ] TypeName .
|
||||||
Tag = StringLit .
|
Tag = StringLit .
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
@ -722,28 +724,27 @@ struct {
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
A field declared with a type but no field identifier is an <i>anonymous field</i>.
|
A field declared with a type but no explicit field name is an <i>anonymous field</i>.
|
||||||
Such a field type must be specified as
|
Such a field type must be specified as
|
||||||
a type name <code>T</code> or as a pointer to a type name <code>*T</code>,
|
a type name <code>T</code> or as a pointer to a type name <code>*T</code>,
|
||||||
and <code>T</code> itself may not be
|
and <code>T</code> itself may not be
|
||||||
a pointer type. The unqualified type name acts as the field identifier.
|
a pointer type. The unqualified type name acts as the field name.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
// A struct with four anonymous fields of type T1, *T2, P.T3 and *P.T4
|
// A struct with four anonymous fields of type T1, *T2, P.T3 and *P.T4
|
||||||
struct {
|
struct {
|
||||||
T1; // the field name is T1
|
T1; // field name is T1
|
||||||
*T2; // the field name is T2
|
*T2; // field name is T2
|
||||||
P.T3; // the field name is T3
|
P.T3; // field name is T3
|
||||||
*P.T4; // the field name is T4
|
*P.T4; // field name is T4
|
||||||
x, y int;
|
x, y int; // field names are x and y
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The unqualified type name of an anonymous field must be distinct from the
|
The following declaration is illegal because field names must be unique
|
||||||
field identifier (or unqualified type name for an anonymous field) of every
|
in a struct type:
|
||||||
other field within the struct. The following declaration is illegal:
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
@ -778,7 +779,7 @@ a type named <code>T</code>:
|
|||||||
</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 identifiers in the corresponding
|
which becomes an attribute for all the fields in the corresponding
|
||||||
field declaration. The tags are made
|
field declaration. The tags are made
|
||||||
visible through a <a href="#Package_unsafe">reflection interface</a>
|
visible through a <a href="#Package_unsafe">reflection interface</a>
|
||||||
but are otherwise ignored.
|
but are otherwise ignored.
|
||||||
@ -1915,6 +1916,8 @@ constant key value.
|
|||||||
For struct literals the following rules apply:
|
For struct literals the following rules apply:
|
||||||
</p>
|
</p>
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>A key must be a field name declared in the LiteralType.
|
||||||
|
</li>
|
||||||
<li>A literal that does not contain any keys must
|
<li>A literal that does not contain any keys must
|
||||||
list an element for each struct field in the
|
list an element for each struct field in the
|
||||||
order in which the fields are declared.
|
order in which the fields are declared.
|
||||||
|
Loading…
Reference in New Issue
Block a user