mirror of
https://github.com/golang/go
synced 2024-11-23 04:50:06 -07:00
spec: add new language for alias declarations
For #16339. Change-Id: I7d912ea634bbfacfc0217f97dccb270fde06f16b Reviewed-on: https://go-review.googlesource.com/30601 Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
09692182fa
commit
aff37662d1
@ -1,6 +1,6 @@
|
||||
<!--{
|
||||
"Title": "The Go Programming Language Specification",
|
||||
"Subtitle": "Version of October 19, 2016",
|
||||
"Subtitle": "Version of October 27, 2016",
|
||||
"Path": "/ref/spec"
|
||||
}-->
|
||||
|
||||
@ -1726,8 +1726,12 @@ the left is bound to the value of the <i>n</i>th expression on the
|
||||
right.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
For constant <i>aliases</i>, see the section on <a href="#Alias_declarations">alias declarations</a>.
|
||||
</p>
|
||||
|
||||
<pre class="ebnf">
|
||||
ConstDecl = "const" ( ConstSpec | "(" { ConstSpec ";" } ")" ) .
|
||||
ConstDecl = "const" ( ConstSpec | AliasSpec | "(" { ( ConstSpec | AliasSpec ) ";" } ")" ) .
|
||||
ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] .
|
||||
|
||||
IdentifierList = identifier { "," identifier } .
|
||||
@ -1846,8 +1850,12 @@ and operations defined for the existing type are also defined for the new type.
|
||||
The new type is <a href="#Type_identity">different</a> from the existing type.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
For type <i>aliases</i>, see the section on <a href="#Alias_declarations">alias declarations</a>.
|
||||
</p>
|
||||
|
||||
<pre class="ebnf">
|
||||
TypeDecl = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) .
|
||||
TypeDecl = "type" ( TypeSpec | AliasSpec | "(" { ( TypeSpec | AliasSpec ) ";" } ")" ) .
|
||||
TypeSpec = identifier Type .
|
||||
</pre>
|
||||
|
||||
@ -1928,8 +1936,12 @@ A variable declaration creates one or more variables, binds corresponding
|
||||
identifiers to them, and gives each a type and an initial value.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
For variable <i>aliases</i>, see the section on <a href="#Alias_declarations">alias declarations</a>.
|
||||
</p>
|
||||
|
||||
<pre class="ebnf">
|
||||
VarDecl = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) .
|
||||
VarDecl = "var" ( VarSpec | AliasSpec | "(" { ( VarSpec | AliasSpec ) ";" } ")" ) .
|
||||
VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
|
||||
</pre>
|
||||
|
||||
@ -1976,6 +1988,7 @@ inside a <a href="#Function_declarations">function body</a> if the variable is
|
||||
never used.
|
||||
</p>
|
||||
|
||||
|
||||
<h3 id="Short_variable_declarations">Short variable declarations</h3>
|
||||
|
||||
<p>
|
||||
@ -2006,7 +2019,7 @@ _, y, _ := coord(p) // coord() returns three values; only interested in y coord
|
||||
<p>
|
||||
Unlike regular variable declarations, a short variable declaration may <i>redeclare</i>
|
||||
variables provided they were originally declared earlier in the same block
|
||||
(or the parameter lists if the block is the function body) with the same type,
|
||||
(or the parameter lists if the block is the function body) with the same type,
|
||||
and at least one of the non-<a href="#Blank_identifier">blank</a> variables is new.
|
||||
As a consequence, redeclaration can only appear in a multi-variable short declaration.
|
||||
Redeclaration does not introduce a new variable; it just assigns a new value to the original.
|
||||
@ -2034,8 +2047,12 @@ A function declaration binds an identifier, the <i>function name</i>,
|
||||
to a function.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
For function <i>aliases</i>, see the section on <a href="#Alias_declarations">alias declarations</a>.
|
||||
</p>
|
||||
|
||||
<pre class="ebnf">
|
||||
FunctionDecl = "func" FunctionName ( Function | Signature ) .
|
||||
FunctionDecl = "func" ( FunctionName ( Function | Signature ) ) | AliasSpec .
|
||||
FunctionName = identifier .
|
||||
Function = Signature FunctionBody .
|
||||
FunctionBody = Block .
|
||||
@ -2148,6 +2165,52 @@ However, a function declared this way is not a method.
|
||||
</p>
|
||||
|
||||
|
||||
<h3 id="Alias_declarations">Alias declarations</h3>
|
||||
|
||||
<p>
|
||||
An alias declaration binds an identifier, the <i>alias</i>, to a
|
||||
<a href="#Constant_declarations">constant</a>,
|
||||
<a href="#Type_declarations">type</a>,
|
||||
<a href="#Variable_declarations">variable</a>, or
|
||||
<a href="#Function_declarations">function</a>
|
||||
denoted by a <a href="#Qualified_identifiers">qualified identifier</a> and
|
||||
declared in a different package.
|
||||
</p>
|
||||
|
||||
<pre class="ebnf">
|
||||
AliasSpec = identifier "=>" QualifiedIdent .
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
The effect of referring to a constant, type, variable, or function by an alias
|
||||
is indistinguishable from referring to it by its original name.
|
||||
For example, the type denoted by a type alias and the aliased type are
|
||||
<a href="#Type_identity">identical</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
An alias declaration may appear only as a form of constant, type, variable,
|
||||
or function declaration at the package level, and the aliased entity must be
|
||||
a constant, type, variable, or function respectively. Alias declarations inside
|
||||
functions are not permitted.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
const (
|
||||
G = 6.67408e-11 // regular and alias declarations may be grouped
|
||||
Pi => math.Pi // same effect as: Pi = math.Pi
|
||||
)
|
||||
|
||||
type Struct => types.Struct // re-export of types.Struct
|
||||
|
||||
func sin => math.Sin // non-exported shortcut for frequently used function
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
An alias declaration may not refer to package <a href="#Package_unsafe">unsafe</a>.
|
||||
</p>
|
||||
|
||||
|
||||
<h2 id="Expressions">Expressions</h2>
|
||||
|
||||
<p>
|
||||
|
Loading…
Reference in New Issue
Block a user