<!--{
"Title": "The Go Programming Language Specification",
- "Subtitle": "Version of October 19, 2016",
+ "Subtitle": "Version of October 27, 2016",
"Path": "/ref/spec"
}-->
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 } .
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>
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>
never used.
</p>
+
<h3 id="Short_variable_declarations">Short variable declarations</h3>
<p>
<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.
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 .
</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>