Commit a12141e5 authored by Robert Griesemer's avatar Robert Griesemer

go spec: relaxed syntax for array, slice, and map composite literals

For elements which are themselves composite literals, the type may
be omitted if it is identical to the element type of the containing
composite literal.

R=r, rsc, iant, ken2
CC=golang-dev
https://golang.org/cl/2661041
parent 1c8f1856
<!-- title The Go Programming Language Specification --> <!-- title The Go Programming Language Specification -->
<!-- subtitle Version of Sep 28, 2010 --> <!-- subtitle Version of Oct 21, 2010 -->
<!-- <!--
TODO TODO
...@@ -1971,15 +1971,16 @@ a single expression or a key-value pair. ...@@ -1971,15 +1971,16 @@ a single expression or a key-value pair.
</p> </p>
<pre class="ebnf"> <pre class="ebnf">
CompositeLit = LiteralType "{" [ ElementList [ "," ] ] "}" . CompositeLit = LiteralType LiteralValue .
LiteralType = StructType | ArrayType | "[" "..." "]" ElementType | LiteralType = StructType | ArrayType | "[" "..." "]" ElementType |
SliceType | MapType | TypeName . SliceType | MapType | TypeName .
LiteralValue = "{" [ ElementList [ "," ] ] "}" .
ElementList = Element { "," Element } . ElementList = Element { "," Element } .
Element = [ Key ":" ] Value . Element = [ Key ":" ] Value .
Key = FieldName | ElementIndex . Key = FieldName | ElementIndex .
FieldName = identifier . FieldName = identifier .
ElementIndex = Expression . ElementIndex = Expression .
Value = Expression . Value = Expression | LiteralValue .
</pre> </pre>
<p> <p>
...@@ -2093,6 +2094,17 @@ and is a shortcut for a slice operation applied to an array literal: ...@@ -2093,6 +2094,17 @@ and is a shortcut for a slice operation applied to an array literal:
[n]T{x1, x2, ... xn}[0 : n] [n]T{x1, x2, ... xn}[0 : n]
</pre> </pre>
<p>
Within a composite literal of array, slice, or map type <code>T</code>,
elements that are themselves composite literals may elide the respective
literal type if it is identical to the element type of <code>T</code>.
</p>
<pre>
[...]Point{{1.5, -3.5}, {0, 0}} // same as [...]Point{Point{1.5, -3.5}, Point{0, 0}}
[][]int{{1, 2, 3}, {4, 5}} // same as [][]int{[]int{1, 2, 3}, []int{4, 5}}
</pre>
<p> <p>
A parsing ambiguity arises when a composite literal using the A parsing ambiguity arises when a composite literal using the
TypeName form of the LiteralType appears between the TypeName form of the LiteralType appears between the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment