go_spec.html 150 KB
Newer Older
1
<!-- title The Go Programming Language Specification -->
Rob Pike's avatar
Rob Pike committed
2
<!-- subtitle Version of Sep 1, 2010 -->
3

4
<!--
5
TODO
6
[ ] need language about function/method calls and parameter passing rules
Rob Pike's avatar
Rob Pike committed
7 8
[ ] last paragraph of #Assignments (constant promotion) should be elsewhere
    and mention assignment to empty interface.
Robert Griesemer's avatar
Robert Griesemer committed
9
[ ] need to say something about "scope" of selectors?
10 11
[ ] clarify what a field name is in struct declarations
    (struct{T} vs struct {T T} vs struct {t T})
12 13
[ ] need explicit language about the result type of operations
[ ] may want to have some examples for the types of shift operations
14
[ ] should string(1<<s) and float(1<<s) be valid?
15 16
[ ] should probably write something about evaluation order of statements even
	though obvious
17 18
[ ] specify iteration direction for range clause
[ ] review language on implicit dereferencing
19
[ ] clarify what it means for two functions to be "the same" when comparing them
20 21
-->

22

23
<h2 id="Introduction">Introduction</h2>
24

25
<p>
Rob Pike's avatar
Rob Pike committed
26
This is a reference manual for the Go programming language. For
27
more information and other documents, see <a href="http://golang.org/">http://golang.org</a>.
Rob Pike's avatar
Rob Pike committed
28
</p>
29

30
<p>
Rob Pike's avatar
Rob Pike committed
31
Go is a general-purpose language designed with systems programming
Rob Pike's avatar
Rob Pike committed
32
in mind. It is strongly typed and garbage-collected and has explicit
Rob Pike's avatar
Rob Pike committed
33 34 35 36 37
support for concurrent programming.  Programs are constructed from
<i>packages</i>, whose properties allow efficient management of
dependencies. The existing implementations use a traditional
compile/link model to generate executable binaries.
</p>
38

39
<p>
Rob Pike's avatar
Rob Pike committed
40 41 42
The grammar is compact and regular, allowing for easy analysis by
automatic tools such as integrated development environments.
</p>
43

44
<h2 id="Notation">Notation</h2>
Rob Pike's avatar
Rob Pike committed
45
<p>
46
The syntax is specified using Extended Backus-Naur Form (EBNF):
Rob Pike's avatar
Rob Pike committed
47
</p>
48

Rob Pike's avatar
Rob Pike committed
49
<pre class="grammar">
Robert Griesemer's avatar
Robert Griesemer committed
50
Production  = production_name "=" Expression "." .
Rob Pike's avatar
Rob Pike committed
51
Expression  = Alternative { "|" Alternative } .
52
Alternative = Term { Term } .
Rob Pike's avatar
Rob Pike committed
53 54
Term        = production_name | token [ "..." token ] | Group | Option | Repetition .
Group       = "(" Expression ")" .
55
Option      = "[" Expression "]" .
Rob Pike's avatar
Rob Pike committed
56
Repetition  = "{" Expression "}" .
57
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
58

Rob Pike's avatar
Rob Pike committed
59 60 61 62
<p>
Productions are expressions constructed from terms and the following
operators, in increasing precedence:
</p>
Rob Pike's avatar
Rob Pike committed
63
<pre class="grammar">
Rob Pike's avatar
Rob Pike committed
64 65 66 67
|   alternation
()  grouping
[]  option (0 or 1 times)
{}  repetition (0 to n times)
68
</pre>
69

70
<p>
Rob Pike's avatar
Rob Pike committed
71 72
Lower-case production names are used to identify lexical tokens.
Non-terminals are in CamelCase. Lexical symbols are enclosed in
Rob Pike's avatar
Rob Pike committed
73
double quotes <code>""</code> or back quotes <code>``</code>.
Rob Pike's avatar
Rob Pike committed
74 75
</p>

76
<p>
77
The form <code>a ... b</code> represents the set of characters from
78
<code>a</code> through <code>b</code> as alternatives.
Rob Pike's avatar
Rob Pike committed
79 80
</p>

81
<h2 id="Source_code_representation">Source code representation</h2>
82

83
<p>
Robert Griesemer's avatar
Robert Griesemer committed
84 85
Source code is Unicode text encoded in
<a href="http://en.wikipedia.org/wiki/UTF-8">UTF-8</a>. The text is not
Rob Pike's avatar
Rob Pike committed
86 87 88 89 90
canonicalized, so a single accented code point is distinct from the
same character constructed from combining an accent and a letter;
those are treated as two code points.  For simplicity, this document
will use the term <i>character</i> to refer to a Unicode code point.
</p>
91
<p>
Rob Pike's avatar
Rob Pike committed
92 93 94
Each code point is distinct; for instance, upper and lower case letters
are different characters.
</p>
Russ Cox's avatar
Russ Cox committed
95
<p>
96 97
Implementation restriction: For compatibility with other tools, a
compiler may disallow the NUL character (U+0000) in the source text.
Russ Cox's avatar
Russ Cox committed
98
</p>
99

100
<h3 id="Characters">Characters</h3>
101

102
<p>
Rob Pike's avatar
Rob Pike committed
103 104
The following terms are used to denote specific Unicode character classes:
</p>
105 106 107 108 109
<pre class="ebnf">
unicode_char   = /* an arbitrary Unicode code point */ .
unicode_letter = /* a Unicode code point classified as "Letter" */ .
unicode_digit  = /* a Unicode code point classified as "Digit" */ .
</pre>
110

Rob Pike's avatar
Rob Pike committed
111
<p>
Robert Griesemer's avatar
Robert Griesemer committed
112
In <a href="http://www.unicode.org/versions/Unicode5.2.0/">The Unicode Standard 5.2</a>,
Rob Pike's avatar
Rob Pike committed
113 114 115 116 117
Section 4.5 General Category-Normative
defines a set of character categories.  Go treats
those characters in category Lu, Ll, Lt, Lm, or Lo as Unicode letters,
and those in category Nd as Unicode digits.
</p>
118

119
<h3 id="Letters_and_digits">Letters and digits</h3>
Rob Pike's avatar
Rob Pike committed
120 121

<p>
122
The underscore character <code>_</code> (U+005F) is considered a letter.
123 124
</p>
<pre class="ebnf">
125 126 127 128 129
letter        = unicode_letter | "_" .
decimal_digit = "0" ... "9" .
octal_digit   = "0" ... "7" .
hex_digit     = "0" ... "9" | "A" ... "F" | "a" ... "f" .
</pre>
Rob Pike's avatar
Rob Pike committed
130

131
<h2 id="Lexical_elements">Lexical elements</h2>
132

133
<h3 id="Comments">Comments</h3>
134

Rob Pike's avatar
Rob Pike committed
135
<p>
136
There are two forms of comments:
Rob Pike's avatar
Rob Pike committed
137 138
</p>

139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
<ol>
<li>
<i>Line comments</i> start with the character sequence <code>//</code>
and continue through the next newline. A line comment acts like a newline.
</li>
<li>
<i>General comments</i> start with the character sequence <code>/*</code>
and continue through the character sequence <code>*/</code>. A general
comment that spans multiple lines acts like a newline, otherwise it acts
like a space.
</li>
</ol>

<p>
Comments do not nest.
</p>


157
<h3 id="Tokens">Tokens</h3>
158

Rob Pike's avatar
Rob Pike committed
159 160
<p>
Tokens form the vocabulary of the Go language.
Robert Griesemer's avatar
Robert Griesemer committed
161 162
There are four classes: <i>identifiers</i>, <i>keywords</i>, <i>operators
and delimiters</i>, and <i>literals</i>.  <i>White space</i>, formed from
163 164 165
spaces (U+0020), horizontal tabs (U+0009),
carriage returns (U+000D), and newlines (U+000A),
is ignored except as it separates tokens
Robert Griesemer's avatar
Robert Griesemer committed
166 167
that would otherwise combine into a single token. Also, a newline
may trigger the insertion of a <a href="#Semicolons">semicolon</a>.
168
While breaking the input into tokens,
Rob Pike's avatar
Rob Pike committed
169 170 171
the next token is the longest sequence of characters that form a
valid token.
</p>
172

173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
<h3 id="Semicolons">Semicolons</h3>

<p>
The formal grammar uses semicolons <code>";"</code> as terminators in
a number of productions. Go programs may omit most of these semicolons
using the following two rules:
</p>

<ol>
<li>
<p>
When the input is broken into tokens, a semicolon is automatically inserted
into the token stream at the end of a non-blank line if the line's final
token is
</p>
<ul>
189 190
	<li>an
	    <a href="#Identifiers">identifier</a>
191
	</li>
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
	
	<li>an
	    <a href="#Integer_literals">integer</a>,
	    <a href="#Floating-point_literals">floating-point</a>,
	    <a href="#Imaginary_literals">imaginary</a>,
	    <a href="#Character_literals">character</a>, or
	    <a href="#String_literals">string</a> literal
	</li>
	
	<li>one of the <a href="#Keywords">keywords</a>
	    <code>break</code>,
	    <code>continue</code>,
	    <code>fallthrough</code>, or
	    <code>return</code>
	</li>
	
	<li>one of the <a href="#Operators_and_Delimiters">operators and delimiters</a>
	    <code>++</code>,
	    <code>--</code>,
	    <code>)</code>,
	    <code>]</code>, or
	    <code>}</code>
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
	</li>
</ul>
</li>

<li>
To allow complex statements to occupy a single line, a semicolon
may be omitted before a closing <code>")"</code> or <code>"}"</code>.
</li>
</ol>

<p>
To reflect idiomatic use, code examples in this document elide semicolons
using these rules.
</p>


230
<h3 id="Identifiers">Identifiers</h3>
231

Rob Pike's avatar
Rob Pike committed
232 233 234 235 236
<p>
Identifiers name program entities such as variables and types.
An identifier is a sequence of one or more letters and digits.
The first character in an identifier must be a letter.
</p>
237
<pre class="ebnf">
238
identifier = letter { letter | unicode_digit } .
239 240 241 242 243 244 245
</pre>
<pre>
a
_x9
ThisVariableIsExported
αβ
</pre>
246 247

<p>
Robert Griesemer's avatar
Robert Griesemer committed
248
Some identifiers are <a href="#Predeclared_identifiers">predeclared</a>.
249 250
</p>

251

252
<h3 id="Keywords">Keywords</h3>
253

Rob Pike's avatar
Rob Pike committed
254 255 256 257 258 259 260 261 262 263
<p>
The following keywords are reserved and may not be used as identifiers.
</p>
<pre class="grammar">
break        default      func         interface    select
case         defer        go           map          struct
chan         else         goto         package      switch
const        fallthrough  if           range        type
continue     for          import       return       var
</pre>
264

265
<h3 id="Operators_and_Delimiters">Operators and Delimiters</h3>
Rob Pike's avatar
Rob Pike committed
266 267

<p>
268
The following character sequences represent <a href="#Operators">operators</a>, delimiters, and other special tokens:
Rob Pike's avatar
Rob Pike committed
269 270 271 272 273
</p>
<pre class="grammar">
+    &amp;     +=    &amp;=     &amp;&amp;    ==    !=    (    )
-    |     -=    |=     ||    &lt;     &lt;=    [    ]
*    ^     *=    ^=     &lt;-    &gt;     &gt;=    {    }
Robert Griesemer's avatar
Robert Griesemer committed
274 275
/    &lt;&lt;    /=    &lt;&lt;=    ++    =     :=    ,    ;
%    &gt;&gt;    %=    &gt;&gt;=    --    !     ...   .    :
Rob Pike's avatar
Rob Pike committed
276
     &amp;^          &amp;^=
Rob Pike's avatar
Rob Pike committed
277 278
</pre>

279
<h3 id="Integer_literals">Integer literals</h3>
Rob Pike's avatar
Rob Pike committed
280 281

<p>
282 283 284
An integer literal is a sequence of digits representing an
<a href="#Constants">integer constant</a>.
An optional prefix sets a non-decimal base: <code>0</code> for octal, <code>0x</code> or
285 286
<code>0X</code> for hexadecimal.  In hexadecimal literals, letters
<code>a-f</code> and <code>A-F</code> represent values 10 through 15.
Rob Pike's avatar
Rob Pike committed
287
</p>
288
<pre class="ebnf">
289 290 291 292
int_lit     = decimal_lit | octal_lit | hex_lit .
decimal_lit = ( "1" ... "9" ) { decimal_digit } .
octal_lit   = "0" { octal_digit } .
hex_lit     = "0" ( "x" | "X" ) hex_digit { hex_digit } .
293 294 295 296 297 298 299 300
</pre>

<pre>
42
0600
0xBadFace
170141183460469231731687303715884105727
</pre>
301

302
<h3 id="Floating-point_literals">Floating-point literals</h3>
Rob Pike's avatar
Rob Pike committed
303
<p>
304 305 306
A floating-point literal is a decimal representation of a
<a href="#Constants">floating-point constant</a>.
It has an integer part, a decimal point, a fractional part,
Rob Pike's avatar
Rob Pike committed
307
and an exponent part.  The integer and fractional part comprise
308
decimal digits; the exponent part is an <code>e</code> or <code>E</code>
Rob Pike's avatar
Rob Pike committed
309 310 311 312
followed by an optionally signed decimal exponent.  One of the
integer part or the fractional part may be elided; one of the decimal
point or the exponent may be elided.
</p>
313
<pre class="ebnf">
314 315 316 317 318
float_lit = decimals "." [ decimals ] [ exponent ] |
            decimals exponent |
            "." decimals [ exponent ] .
decimals  = decimal_digit { decimal_digit } .
exponent  = ( "e" | "E" ) [ "+" | "-" ] decimals .
319 320 321 322
</pre>

<pre>
0.
Rob Pike's avatar
Rob Pike committed
323 324
72.40
072.40  // == 72.40
325 326 327 328 329 330 331
2.71828
1.e+0
6.67428e-11
1E6
.25
.12345E+5
</pre>
332

Rob Pike's avatar
Rob Pike committed
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
<h3 id="Imaginary_literals">Imaginary literals</h3>
<p>
An imaginary literal is a decimal representation of the imaginary part of a
<a href="#Constants">complex constant</a>.
It consists of a
<a href="#Floating-point_literals">floating-point literal</a>
or decimal integer followed
by the lower-case letter <code>i</code>.
</p>
<pre class="ebnf">
imaginary_lit = (decimals | float_lit) "i" .
</pre>

<pre>
0i
011i  // == 11i
0.i
2.71828i
1.e+0i
6.67428e-11i
1E6i
.25i
.12345E+5i
</pre>

358

359
<h3 id="Character_literals">Character literals</h3>
360

Rob Pike's avatar
Rob Pike committed
361
<p>
362 363
A character literal represents an <a href="#Constants">integer constant</a>,
typically a Unicode code point, as one or more characters enclosed in single
Rob Pike's avatar
Rob Pike committed
364 365 366 367
quotes.  Within the quotes, any character may appear except single
quote and newline. A single quoted character represents itself,
while multi-character sequences beginning with a backslash encode
values in various formats.
Rob Pike's avatar
Rob Pike committed
368
</p>
369
<p>
Rob Pike's avatar
Rob Pike committed
370 371 372
The simplest form represents the single character within the quotes;
since Go source text is Unicode characters encoded in UTF-8, multiple
UTF-8-encoded bytes may represent a single integer value.  For
373 374 375 376
instance, the literal <code>'a'</code> holds a single byte representing
a literal <code>a</code>, Unicode U+0061, value <code>0x61</code>, while
<code>'ä'</code> holds two bytes (<code>0xc3</code> <code>0xa4</code>) representing
a literal <code>a</code>-dieresis, U+00E4, value <code>0xe4</code>.
Rob Pike's avatar
Rob Pike committed
377
</p>
378
<p>
Rob Pike's avatar
Rob Pike committed
379 380
Several backslash escapes allow arbitrary values to be represented
as ASCII text.  There are four ways to represent the integer value
381 382 383 384
as a numeric constant: <code>\x</code> followed by exactly two hexadecimal
digits; <code>\u</code> followed by exactly four hexadecimal digits;
<code>\U</code> followed by exactly eight hexadecimal digits, and a
plain backslash <code>\</code> followed by exactly three octal digits.
Rob Pike's avatar
Rob Pike committed
385 386 387
In each case the value of the literal is the value represented by
the digits in the corresponding base.
</p>
388
<p>
Rob Pike's avatar
Rob Pike committed
389 390
Although these representations all result in an integer, they have
different valid ranges.  Octal escapes must represent a value between
Rob Pike's avatar
Rob Pike committed
391 392
0 and 255 inclusive.  Hexadecimal escapes satisfy this condition
by construction. The escapes <code>\u</code> and <code>\U</code>
Rob Pike's avatar
Rob Pike committed
393
represent Unicode code points so within them some values are illegal,
394
in particular those above <code>0x10FFFF</code> and surrogate halves.
Rob Pike's avatar
Rob Pike committed
395
</p>
396
<p>
Rob Pike's avatar
Rob Pike committed
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
After a backslash, certain single-character escapes represent special values:
</p>
<pre class="grammar">
\a   U+0007 alert or bell
\b   U+0008 backspace
\f   U+000C form feed
\n   U+000A line feed or newline
\r   U+000D carriage return
\t   U+0009 horizontal tab
\v   U+000b vertical tab
\\   U+005c backslash
\'   U+0027 single quote  (valid escape only within character literals)
\"   U+0022 double quote  (valid escape only within string literals)
</pre>
<p>
412
All other sequences starting with a backslash are illegal inside character literals.
Rob Pike's avatar
Rob Pike committed
413
</p>
414
<pre class="ebnf">
Rob Pike's avatar
Rob Pike committed
415 416 417
char_lit         = "'" ( unicode_value | byte_value ) "'" .
unicode_value    = unicode_char | little_u_value | big_u_value | escaped_char .
byte_value       = octal_byte_value | hex_byte_value .
418 419 420 421
octal_byte_value = `\` octal_digit octal_digit octal_digit .
hex_byte_value   = `\` "x" hex_digit hex_digit .
little_u_value   = `\` "u" hex_digit hex_digit hex_digit hex_digit .
big_u_value      = `\` "U" hex_digit hex_digit hex_digit hex_digit
Rob Pike's avatar
Rob Pike committed
422
                           hex_digit hex_digit hex_digit hex_digit .
423
escaped_char     = `\` ( "a" | "b" | "f" | "n" | "r" | "t" | "v" | `\` | "'" | `"` ) .
Rob Pike's avatar
Rob Pike committed
424
</pre>
425

426 427 428 429 430 431 432 433 434 435 436 437 438
<pre>
'a'
'ä'
'本'
'\t'
'\000'
'\007'
'\377'
'\x07'
'\xff'
'\u12e4'
'\U00101234'
</pre>
439 440


441
<h3 id="String_literals">String literals</h3>
Rob Pike's avatar
Rob Pike committed
442 443

<p>
444 445 446
A string literal represents a <a href="#Constants">string constant</a>
obtained from concatenating a sequence of characters. There are two forms:
raw string literals and interpreted string literals.
Rob Pike's avatar
Rob Pike committed
447 448 449
</p>
<p>
Raw string literals are character sequences between back quotes
450
<code>``</code>.  Within the quotes, any character is legal except
451 452 453 454
back quote. The value of a raw string literal is the
string composed of the uninterpreted characters between the quotes;
in particular, backslashes have no special meaning and the string may
span multiple lines.
Rob Pike's avatar
Rob Pike committed
455 456 457
</p>
<p>
Interpreted string literals are character sequences between double
458 459
quotes <code>&quot;&quot;</code>. The text between the quotes,
which may not span multiple lines, forms the
Rob Pike's avatar
Rob Pike committed
460
value of the literal, with backslash escapes interpreted as they
461
are in character literals (except that <code>\'</code> is illegal and
Robert Griesemer's avatar
Robert Griesemer committed
462 463
<code>\"</code> is legal).  The three-digit octal (<code>\</code><i>nnn</i>)
and two-digit hexadecimal (<code>\x</code><i>nn</i>) escapes represent individual
Rob Pike's avatar
Rob Pike committed
464 465
<i>bytes</i> of the resulting string; all other escapes represent
the (possibly multi-byte) UTF-8 encoding of individual <i>characters</i>.
466 467 468
Thus inside a string literal <code>\377</code> and <code>\xFF</code> represent
a single byte of value <code>0xFF</code>=255, while <code>ÿ</code>,
<code>\u00FF</code>, <code>\U000000FF</code> and <code>\xc3\xbf</code> represent
469
the two bytes <code>0xc3</code> <code>0xbf</code> of the UTF-8 encoding of character
Rob Pike's avatar
Rob Pike committed
470 471 472
U+00FF.
</p>

473
<pre class="ebnf">
Rob Pike's avatar
Rob Pike committed
474 475
string_lit             = raw_string_lit | interpreted_string_lit .
raw_string_lit         = "`" { unicode_char } "`" .
476
interpreted_string_lit = `"` { unicode_value | byte_value } `"` .
477
</pre>
478

479
<pre>
480 481 482
`abc`  // same as "abc"
`\n
\n`    // same as "\\n\n\\n"
483 484 485 486 487 488 489
"\n"
""
"Hello, world!\n"
"日本語"
"\u65e5本\U00008a9e"
"\xff\u00FF"
</pre>
490

Rob Pike's avatar
Rob Pike committed
491
<p>
492
These examples all represent the same string:
Rob Pike's avatar
Rob Pike committed
493
</p>
494

495
<pre>
Rob Pike's avatar
Rob Pike committed
496 497 498 499
"日本語"                                 // UTF-8 input text
`日本語`                                 // UTF-8 input text as a raw literal
"\u65e5\u672c\u8a9e"                    // The explicit Unicode code points
"\U000065e5\U0000672c\U00008a9e"        // The explicit Unicode code points
500 501
"\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"  // The explicit UTF-8 bytes
</pre>
502

503
<p>
504 505 506 507 508
If the source code represents a character as two code points, such as
a combining form involving an accent and a letter, the result will be
an error if placed in a character literal (it is not a single code
point), and will appear as two code points if placed in a string
literal.
Rob Pike's avatar
Rob Pike committed
509
</p>
510

511 512 513

<h2 id="Constants">Constants</h2>

Rob Pike's avatar
Rob Pike committed
514 515 516 517
<p>There are <i>boolean constants</i>, <i>integer constants</i>,
<i>floating-point constants</i>, <i>complex constants</i>,
and <i>string constants</i>. Integer, floating-point,
and complex constants are
518 519 520 521 522 523 524
collectively called <i>numeric constants</i>.
</p>

<p>
A constant value is represented by an
<a href="#Integer_literals">integer</a>,
<a href="#Floating-point_literals">floating-point</a>,
Rob Pike's avatar
Rob Pike committed
525
<a href="#Imaginary_literals">imaginary</a>,
526 527 528 529
<a href="#Character_literals">character</a>, or
<a href="#String_literals">string</a> literal,
an identifier denoting a constant,
a <a href="#Constant_expressions">constant expression</a>, or
530 531 532 533
the result value of some built-in functions such as
<code>unsafe.Sizeof</code> applied to any value,
<code>cap</code> or <code>len</code> applied to
<a href="#Length_and_capacity">some expressions</a>,
Rob Pike's avatar
Rob Pike committed
534 535
<code>real</code> and <code>imag</code> applied to a complex constant
and <code>cmplx</code> applied to numeric constants.
536 537 538 539
The boolean truth values are represented by the predeclared constants
<code>true</code> and <code>false</code>. The predeclared identifier
<a href="#Iota">iota</a> denotes an integer constant.
</p>
Rob Pike's avatar
Rob Pike committed
540

Rob Pike's avatar
Rob Pike committed
541 542 543 544 545 546
<p>
In general, complex constants are a form of
<a href="#Constant_expressions">constant expression</a>
and are discussed in that section.
</p>

Rob Pike's avatar
Rob Pike committed
547
<p>
Robert Griesemer's avatar
Robert Griesemer committed
548
Numeric constants represent values of arbitrary precision and do not overflow.
Rob Pike's avatar
Rob Pike committed
549 550
</p>

551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
<p>
Constants may be <a href="#Types">typed</a> or untyped.
Literal constants, <code>true</code>, <code>false</code>, <code>iota</code>,
and certain <a href="#Constant_expressions">constant expressions</a>
containing only untyped constant operands are untyped.
</p>

<p>
A constant may be given a type explicitly by a <a href="#Constant_declarations">constant declaration</a>
or <a href="#Conversions">conversion</a>, or implicitly when used in a
<a href="#Variable_declarations">variable declaration</a> or an
<a href="#Assignments">assignment</a> or as an
operand in an <a href="#Expressions">expression</a>.
It is an error if the constant value
cannot be accurately represented as a value of the respective type.
Robert Griesemer's avatar
Robert Griesemer committed
566
For instance, <code>3.0</code> can be given any integer or any
567 568 569
floating-point type, while <code>2147483648.0</code> (equal to <code>1&lt;&lt;31</code>)
can be given the types <code>float32</code>, <code>float64</code>, or <code>uint32</code> but
not <code>int32</code> or <code>string</code>.
570 571
</p>

572 573 574 575 576 577 578 579 580 581
<p>
There are no constants denoting the IEEE-754 infinity and not-a-number values,
but the <a href="/pkg/math/"><code>math</code> package</a>'s
<a href="/pkg/math/#Inf">Inf</a>,
<a href="/pkg/math/#NaN">NaN</a>,
<a href="/pkg/math/#IsInf">IsInf</a>, and
<a href="/pkg/math/#IsNaN">IsNaN</a>
functions return and test for those values at run time.
</p>

582 583 584 585 586 587 588
<p>
Implementation restriction: A compiler may implement numeric constants by choosing
an internal representation with at least twice as many bits as any machine type;
for floating-point values, both the mantissa and exponent must be twice as large.
</p>


589
<h2 id="Types">Types</h2>
590

591
<p>
Robert Griesemer's avatar
Robert Griesemer committed
592 593
A type determines the set of values and operations specific to values of that
type.  A type may be specified by a (possibly qualified) <i>type name</i>
594
<a href="#Qualified_identifier">Qualified identifier</a>, §<a href="#Type_declarations">Type declarations</a>) or a <i>type literal</i>,
Robert Griesemer's avatar
Robert Griesemer committed
595
which composes a new type from previously declared types.
Rob Pike's avatar
Rob Pike committed
596
</p>
597

598
<pre class="ebnf">
Rob Pike's avatar
Rob Pike committed
599 600 601 602
Type      = TypeName | TypeLit | "(" Type ")" .
TypeName  = QualifiedIdent.
TypeLit   = ArrayType | StructType | PointerType | FunctionType | InterfaceType |
	    SliceType | MapType | ChannelType .
603
</pre>
604

605
<p>
606 607 608 609 610
Named instances of the boolean, numeric, and string types are
<a href="#Predeclared_identifiers">predeclared</a>.
<i>Composite types</i>&mdash;array, struct, pointer, function,
interface, slice, map, and channel types&mdash;may be constructed using
type literals.
Rob Pike's avatar
Rob Pike committed
611
</p>
612

613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633
<p>
Each type <code>T</code> has an <i>underlying type</i>: If <code>T</code>
is a predeclared type or a type literal, the corresponding underlying
type is <code>T</code> itself. Otherwise, <code>T</code>'s underlying type
is the underlying type of the type to which <code>T</code> refers in its
<a href="#Type_declarations">type declaration</a>.
</p>

<pre>
   type T1 string
   type T2 T1
   type T3 []T1
   type T4 T3
</pre>

<p>
The underlying type of <code>string</code>, <code>T1</code>, and <code>T2</code>
is <code>string</code>. The underlying type of <code>[]T1</code>, <code>T3</code>,
and <code>T4</code> is <code>[]T1</code>.
</p>

Rob Pike's avatar
Rob Pike committed
634
<p>
635
A type may have a <i>method set</i> associated with it
636
<a href="#Interface_types">Interface types</a>, §<a href="#Method_declarations">Method declarations</a>).
637
The method set of an <a href="#Interface_types">interface type</a> is its interface.
Robert Griesemer's avatar
Robert Griesemer committed
638
The method set of any other named type <code>T</code>
639
consists of all methods with receiver type <code>T</code>.
Robert Griesemer's avatar
Robert Griesemer committed
640 641 642 643
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>
(that is, it also contains the method set of <code>T</code>).
Any other type has an empty method set.
644
In a method set, each method must have a unique name.
Rob Pike's avatar
Rob Pike committed
645 646 647 648
</p>
<p>
The <i>static type</i> (or just <i>type</i>) of a variable is the
type defined by its declaration.  Variables of interface type
649
also have a distinct <i>dynamic type</i>, which
Rob Pike's avatar
Rob Pike committed
650
is the actual type of the value stored in the variable at run-time.
651
The dynamic type may vary during execution but is always
652
<a href="#Assignability">assignable</a>
653
to the static type of the interface variable.  For non-interface
Rob Pike's avatar
Rob Pike committed
654 655
types, the dynamic type is always the static type.
</p>
Robert Griesemer's avatar
Robert Griesemer committed
656

657

658 659 660 661 662 663
<h3 id="Boolean_types">Boolean types</h3>

A <i>boolean type</i> represents the set of Boolean truth values
denoted by the predeclared constants <code>true</code>
and <code>false</code>. The predeclared boolean type is <code>bool</code>.

664

665
<h3 id="Numeric_types">Numeric types</h3>
666

Rob Pike's avatar
Rob Pike committed
667
<p>
668 669
A <i>numeric type</i> represents sets of integer or floating-point values.
The predeclared architecture-independent numeric types are:
Rob Pike's avatar
Rob Pike committed
670
</p>
671

Rob Pike's avatar
Rob Pike committed
672
<pre class="grammar">
Rob Pike's avatar
Rob Pike committed
673 674 675 676 677 678 679 680 681
uint8       the set of all unsigned  8-bit integers (0 to 255)
uint16      the set of all unsigned 16-bit integers (0 to 65535)
uint32      the set of all unsigned 32-bit integers (0 to 4294967295)
uint64      the set of all unsigned 64-bit integers (0 to 18446744073709551615)

int8        the set of all signed  8-bit integers (-128 to 127)
int16       the set of all signed 16-bit integers (-32768 to 32767)
int32       the set of all signed 32-bit integers (-2147483648 to 2147483647)
int64       the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)
682

Rob Pike's avatar
Rob Pike committed
683 684
float32     the set of all IEEE-754 32-bit floating-point numbers
float64     the set of all IEEE-754 64-bit floating-point numbers
685

Rob Pike's avatar
Rob Pike committed
686 687
complex64   the set of all complex numbers with float32 real and imaginary parts
complex128  the set of all complex numbers with float64 real and imaginary parts
Rob Pike's avatar
Rob Pike committed
688

689
byte        familiar alias for uint8
690
</pre>
691

Rob Pike's avatar
Rob Pike committed
692
<p>
Robert Griesemer's avatar
Robert Griesemer committed
693 694
The value of an <i>n</i>-bit integer is <i>n</i> bits wide and represented using
<a href="http://en.wikipedia.org/wiki/Two's_complement">two's complement arithmetic</a>.
Rob Pike's avatar
Rob Pike committed
695
</p>
696

Rob Pike's avatar
Rob Pike committed
697
<p>
698
There is also a set of predeclared numeric types with implementation-specific sizes:
Rob Pike's avatar
Rob Pike committed
699
</p>
700

701
<pre class="grammar">
702 703 704
uint     either 32 or 64 bits
int      either 32 or 64 bits
float    either 32 or 64 bits
Rob Pike's avatar
Rob Pike committed
705
complex  real and imaginary parts have type float
706
uintptr  an unsigned integer large enough to store the uninterpreted bits of a pointer value
707
</pre>
708

709
<p>
710 711 712
To avoid portability issues all numeric types are distinct except
<code>byte</code>, which is an alias for <code>uint8</code>.
Conversions
713
are required when different numeric types are mixed in an expression
Rob Pike's avatar
Rob Pike committed
714
or assignment. For instance, <code>int32</code> and <code>int</code>
715
are not the same type even though they may have the same size on a
Rob Pike's avatar
Rob Pike committed
716
particular architecture.
717

718

719
<h3 id="String_types">String types</h3>
720

721
<p>
722
A <i>string type</i> represents the set of string values.
Rob Pike's avatar
Rob Pike committed
723 724
Strings behave like arrays of bytes but are immutable: once created,
it is impossible to change the contents of a string.
725
The predeclared string type is <code>string</code>.
Rob Pike's avatar
Rob Pike committed
726 727 728

<p>
The elements of strings have type <code>byte</code> and may be
729
accessed using the usual <a href="#Indexes">indexing operations</a>.  It is
Rob Pike's avatar
Rob Pike committed
730 731
illegal to take the address of such an element; if
<code>s[i]</code> is the <i>i</i>th byte of a
732 733
string, <code>&amp;s[i]</code> is invalid.  The length of string
<code>s</code> can be discovered using the built-in function
734
<code>len</code>. The length is a compile-time constant if <code>s</code>
735
is a string literal.
Rob Pike's avatar
Rob Pike committed
736
</p>
737 738


739
<h3 id="Array_types">Array types</h3>
Russ Cox's avatar
Russ Cox committed
740 741 742

<p>
An array is a numbered sequence of elements of a single
743 744
type, called the element type.
The number of elements is called the length and is never
Russ Cox's avatar
Russ Cox committed
745 746 747
negative.
</p>

748
<pre class="ebnf">
Russ Cox's avatar
Russ Cox committed
749 750
ArrayType   = "[" ArrayLength "]" ElementType .
ArrayLength = Expression .
751
ElementType = Type .
Russ Cox's avatar
Russ Cox committed
752 753 754
</pre>

<p>
Robert Griesemer's avatar
Robert Griesemer committed
755
The length is part of the array's type and must be a
Robert Griesemer's avatar
Robert Griesemer committed
756
<a href="#Constant_expressions">constant expression</a> that evaluates to a non-negative
Russ Cox's avatar
Russ Cox committed
757
integer value.  The length of array <code>a</code> can be discovered
758 759
using the built-in function <a href="#Length_and_capacity"><code>len(a)</code></a>.
The elements can be indexed by integer
760
indices 0 through the <code>len(a)-1</code><a href="#Indexes">Indexes</a>).
761 762
Array types are always one-dimensional but may be composed to form
multi-dimensional types.
Russ Cox's avatar
Russ Cox committed
763 764 765 766 767 768
</p>

<pre>
[32]byte
[2*N] struct { x, y int32 }
[1000]*float64
769 770
[3][5]int
[2][2][2]float64  // same as [2]([2]([2]float64))
Russ Cox's avatar
Russ Cox committed
771 772
</pre>

773
<h3 id="Slice_types">Slice types</h3>
Russ Cox's avatar
Russ Cox committed
774 775 776 777 778

<p>
A slice is a reference to a contiguous segment of an array and
contains a numbered sequence of elements from that array.  A slice
type denotes the set of all slices of arrays of its element type.
779
The value of an uninitialized slice is <code>nil</code>.
Russ Cox's avatar
Russ Cox committed
780 781
</p>

782
<pre class="ebnf">
Russ Cox's avatar
Russ Cox committed
783 784 785 786 787 788
SliceType = "[" "]" ElementType .
</pre>

<p>
Like arrays, slices are indexable and have a length.  The length of a
slice <code>s</code> can be discovered by the built-in function
789
<a href="#Length_and_capacity"><code>len(s)</code></a>; unlike with arrays it may change during
Russ Cox's avatar
Russ Cox committed
790
execution.  The elements can be addressed by integer indices 0
791
through <code>len(s)-1</code><a href="#Indexes">Indexes</a>).  The slice index of a
Russ Cox's avatar
Russ Cox committed
792 793 794 795 796
given element may be less than the index of the same element in the
underlying array.
</p>
<p>
A slice, once initialized, is always associated with an underlying
Rob Pike's avatar
Rob Pike committed
797
array that holds its elements.  A slice therefore shares storage
Russ Cox's avatar
Russ Cox committed
798 799 800 801 802
with its array and with other slices of the same array; by contrast,
distinct arrays always represent distinct storage.
</p>
<p>
The array underlying a slice may extend past the end of the slice.
803
The <i>capacity</i> is a measure of that extent: it is the sum of
Russ Cox's avatar
Russ Cox committed
804 805
the length of the slice and the length of the array beyond the slice;
a slice of length up to that capacity can be created by `slicing' a new
806
one from the original slice (§<a href="#Slices">Slices</a>).
Russ Cox's avatar
Russ Cox committed
807
The capacity of a slice <code>a</code> can be discovered using the
808
built-in function <a href="#Length_and_capacity"><code>cap(a)</code></a>.
Russ Cox's avatar
Russ Cox committed
809 810 811
</p>

<p>
812 813 814 815
A new, initialized slice value for a given element type <code>T</code> is
made using the built-in function
<a href="#Making_slices_maps_and_channels"><code>make</code></a>,
which takes a slice type
Russ Cox's avatar
Russ Cox committed
816 817 818 819 820 821 822
and parameters specifying the length and optionally the capacity:
</p>

<pre>
make([]T, length)
make([]T, length, capacity)
</pre>
823

Russ Cox's avatar
Russ Cox committed
824 825
<p>
The <code>make()</code> call allocates a new, hidden array to which the returned
Rob Pike's avatar
Rob Pike committed
826
slice value refers. That is, executing
Russ Cox's avatar
Russ Cox committed
827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842
</p>

<pre>
make([]T, length, capacity)
</pre>

<p>
produces the same slice as allocating an array and slicing it, so these two examples
result in the same slice:
</p>

<pre>
make([]int, 50, 100)
new([100]int)[0:50]
</pre>

843 844 845 846 847 848 849
<p>
Like arrays, slices are always one-dimensional but may be composed to construct
higher-dimensional objects.
With arrays of arrays, the inner arrays are, by construction, always the same length;
however with slices of slices (or arrays of slices), the lengths may vary dynamically.
Moreover, the inner slices must be allocated individually (with <code>make</code>).
</p>
Russ Cox's avatar
Russ Cox committed
850

851
<h3 id="Struct_types">Struct types</h3>
852

Rob Pike's avatar
Rob Pike committed
853
<p>
854 855 856 857 858
A struct is a sequence of named elements, called fields, each of which has a
name and a type. Field names may be specified explicitly (IdentifierList) or
implicitly (AnonymousField).
Within a struct, non-<a href="#Blank_identifier">blank</a> field names must
be unique.
Rob Pike's avatar
Rob Pike committed
859
</p>
860

861
<pre class="ebnf">
862
StructType     = "struct" "{" { FieldDecl ";" } "}" .
863 864
FieldDecl      = (IdentifierList Type | AnonymousField) [ Tag ] .
AnonymousField = [ "*" ] TypeName .
865
Tag            = string_lit .
866
</pre>
867

868
<pre>
869 870
// An empty struct.
struct {}
871

Robert Griesemer's avatar
Robert Griesemer committed
872
// A struct with 6 fields.
873
struct {
874 875 876 877 878
	x, y int
	u float
	_ float  // padding
	A *[]int
	F func()
879 880
}
</pre>
881

Rob Pike's avatar
Rob Pike committed
882
<p>
883
A field declared with a type but no explicit field name is an <i>anonymous field</i>.
Rob Pike's avatar
Rob Pike committed
884
Such a field type must be specified as
885
a type name <code>T</code> or as a pointer to a type name <code>*T</code>,
886
and <code>T</code> itself may not be
887
a pointer type. The unqualified type name acts as the field name.
Rob Pike's avatar
Rob Pike committed
888
</p>
889

890 891 892
<pre>
// A struct with four anonymous fields of type T1, *T2, P.T3 and *P.T4
struct {
893 894 895 896 897
	T1        // field name is T1
	*T2       // field name is T2
	P.T3      // field name is T3
	*P.T4     // field name is T4
	x, y int  // field names are x and y
898
}
899 900
</pre>

Rob Pike's avatar
Rob Pike committed
901
<p>
902 903
The following declaration is illegal because field names must be unique
in a struct type:
Rob Pike's avatar
Rob Pike committed
904
</p>
905

906
<pre>
907
struct {
908 909 910
	T         // conflicts with anonymous field *T and *P.T
	*T        // conflicts with anonymous field T and *P.T
	*P.T      // conflicts with anonymous field T and *T
911
}
912
</pre>
913

914
<p>
915 916
Fields and methods (§<a href="#Method_declarations">Method declarations</a>) of an anonymous field are
promoted to be ordinary fields and methods of the struct (§<a href="#Selectors">Selectors</a>).
Robert Griesemer's avatar
Robert Griesemer committed
917 918
The following rules apply for a struct type named <code>S</code> and
a type named <code>T</code>:
Rob Pike's avatar
Rob Pike committed
919
</p>
Robert Griesemer's avatar
Robert Griesemer committed
920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935
<ul>
	<li>If <code>S</code> contains an anonymous field <code>T</code>, the
	    method set of <code>S</code> includes the method set of <code>T</code>.
	</li>

	<li>If <code>S</code> contains an anonymous field <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>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>
</ul>
Rob Pike's avatar
Rob Pike committed
936
<p>
Robert Griesemer's avatar
Robert Griesemer committed
937
A field declaration may be followed by an optional string literal <i>tag</i>,
938
which becomes an attribute for all the fields in the corresponding
Rob Pike's avatar
Rob Pike committed
939
field declaration. The tags are made
940
visible through a <a href="#Package_unsafe">reflection interface</a>
Rob Pike's avatar
Rob Pike committed
941 942
but are otherwise ignored.
</p>
943

944
<pre>
Rob Pike's avatar
Rob Pike committed
945
// A struct corresponding to the TimeStamp protocol buffer.
Rob Pike's avatar
Rob Pike committed
946
// The tag strings define the protocol buffer field numbers.
947
struct {
948 949 950
	microsec  uint64 "field 1"
	serverIP6 uint64 "field 2"
	process   string "field 3"
951
}
952
</pre>
953

954
<h3 id="Pointer_types">Pointer types</h3>
955

Rob Pike's avatar
Rob Pike committed
956
<p>
957
A pointer type denotes the set of all pointers to variables of a given
958
type, called the <i>base type</i> of the pointer.
959
The value of an unitialized pointer is <code>nil</code>.
Rob Pike's avatar
Rob Pike committed
960
</p>
961

962
<pre class="ebnf">
963 964
PointerType = "*" BaseType .
BaseType = Type .
965
</pre>
966

967
<pre>
968
*int
Rob Pike's avatar
Rob Pike committed
969
*map[string] *chan int
970
</pre>
971

972
<h3 id="Function_types">Function types</h3>
973

Rob Pike's avatar
Rob Pike committed
974
<p>
975
A function type denotes the set of all functions with the same parameter
976 977
and result types. The value of an unitialized variable of function type
is <code>nil</code>.
Rob Pike's avatar
Rob Pike committed
978
</p>
979

980
<pre class="ebnf">
Rob Pike's avatar
Rob Pike committed
981 982
FunctionType   = "func" Signature .
Signature      = Parameters [ Result ] .
983
Result         = Parameters | Type .
984
Parameters     = "(" [ ParameterList [ "," ] ] ")" .
Rob Pike's avatar
Rob Pike committed
985
ParameterList  = ParameterDecl { "," ParameterDecl } .
Russ Cox's avatar
Russ Cox committed
986
ParameterDecl  = [ IdentifierList ] [ "..." ] Type .
987 988 989
</pre>

<p>
Rob Pike's avatar
Rob Pike committed
990 991 992 993 994
Within a list of parameters or results, the names (IdentifierList)
must either all be present or all be absent. If present, each name
stands for one item (parameter or result) of the specified type; if absent, each
type stands for one item of that type.  Parameter and result
lists are always parenthesized except that if there is exactly
Robert Griesemer's avatar
Robert Griesemer committed
995
one unnamed result it may be written as an unparenthesized type.
Rob Pike's avatar
Rob Pike committed
996 997
</p>
<p>
Russ Cox's avatar
Russ Cox committed
998 999 1000 1001 1002 1003
If the function's last parameter has a type prefixed with <code>...</code>,
the function may be invoked with zero or more arguments for that parameter,
each of which must be <a href="#Assignability">assignable</a>
to the type that follows the <code>...</code>.
Such a function is called <i>variadic</i>.

Rob Pike's avatar
Rob Pike committed
1004
</p>
1005 1006

<pre>
Russ Cox's avatar
Russ Cox committed
1007 1008 1009
func()
func(x int)
func() int
Russ Cox's avatar
Russ Cox committed
1010
func(prefix string, values ...int)
Russ Cox's avatar
Russ Cox committed
1011 1012
func(a, b int, z float) bool
func(a, b int, z float) (bool)
Russ Cox's avatar
Russ Cox committed
1013
func(a, b int, z float, opt ...interface{}) (success bool)
Russ Cox's avatar
Russ Cox committed
1014 1015
func(int, int, float) (float, *[]int)
func(n int) func(p *T)
1016 1017 1018
</pre>


1019
<h3 id="Interface_types">Interface types</h3>
1020

Rob Pike's avatar
Rob Pike committed
1021
<p>
1022
An interface type specifies a <a href="#Types">method set</a> called its <i>interface</i>.
Robert Griesemer's avatar
Robert Griesemer committed
1023 1024
A variable of interface type can store a value of any type with a method set
that is any superset of the interface. Such a type is said to
1025 1026
<i>implement the interface</i>.
The value of an unitialized variable of interface type is <code>nil</code>.
Rob Pike's avatar
Rob Pike committed
1027
</p>
1028

1029
<pre class="ebnf">
1030
InterfaceType      = "interface" "{" { MethodSpec ";" } "}" .
1031 1032
MethodSpec         = MethodName Signature | InterfaceTypeName .
MethodName         = identifier .
Rob Pike's avatar
Rob Pike committed
1033
InterfaceTypeName  = TypeName .
1034
</pre>
1035

1036 1037 1038 1039
<p>
As with all method sets, in an interface type, each method must have a unique name.
</p>

1040
<pre>
Rob Pike's avatar
Rob Pike committed
1041
// A simple File interface
1042
interface {
1043 1044 1045
	Read(b Buffer) bool
	Write(b Buffer) bool
	Close()
1046 1047
}
</pre>
1048

Rob Pike's avatar
Rob Pike committed
1049
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1050
More than one type may implement an interface.
Rob Pike's avatar
Rob Pike committed
1051
For instance, if two types <code>S1</code> and <code>S2</code>
Robert Griesemer's avatar
Robert Griesemer committed
1052
have the method set
Rob Pike's avatar
Rob Pike committed
1053
</p>
1054

1055
<pre>
1056 1057 1058
func (p T) Read(b Buffer) bool { return ... }
func (p T) Write(b Buffer) bool { return ... }
func (p T) Close() { ... }
1059
</pre>
1060

Rob Pike's avatar
Rob Pike committed
1061 1062 1063 1064 1065 1066
<p>
(where <code>T</code> stands for either <code>S1</code> or <code>S2</code>)
then the <code>File</code> interface is implemented by both <code>S1</code> and
<code>S2</code>, regardless of what other methods
<code>S1</code> and <code>S2</code> may have or share.
</p>
1067

Rob Pike's avatar
Rob Pike committed
1068 1069 1070 1071 1072
<p>
A type implements any interface comprising any subset of its methods
and may therefore implement several distinct interfaces. For
instance, all types implement the <i>empty interface</i>:
</p>
1073

1074
<pre>
1075
interface{}
1076
</pre>
1077

Rob Pike's avatar
Rob Pike committed
1078 1079
<p>
Similarly, consider this interface specification,
Robert Griesemer's avatar
Robert Griesemer committed
1080
which appears within a <a href="#Type_declarations">type declaration</a>
Rob Pike's avatar
Rob Pike committed
1081 1082
to define an interface called <code>Lock</code>:
</p>
1083 1084 1085

<pre>
type Lock interface {
1086 1087
	Lock()
	Unlock()
1088
}
1089
</pre>
1090

Rob Pike's avatar
Rob Pike committed
1091 1092 1093
<p>
If <code>S1</code> and <code>S2</code> also implement
</p>
Robert Griesemer's avatar
Robert Griesemer committed
1094

1095 1096 1097 1098 1099
<pre>
func (p T) Lock() { ... }
func (p T) Unlock() { ... }
</pre>

1100
<p>
Rob Pike's avatar
Rob Pike committed
1101 1102 1103 1104 1105 1106
they implement the <code>Lock</code> interface as well
as the <code>File</code> interface.
</p>
<p>
An interface may contain an interface type name <code>T</code>
in place of a method specification.
1107
The effect is equivalent to enumerating the methods of <code>T</code> explicitly
Rob Pike's avatar
Rob Pike committed
1108 1109
in the interface.
</p>
1110

1111 1112
<pre>
type ReadWrite interface {
1113 1114
	Read(b Buffer) bool
	Write(b Buffer) bool
1115
}
1116

1117
type File interface {
1118 1119 1120
	ReadWrite  // same as enumerating the methods in ReadWrite
	Lock       // same as enumerating the methods in Lock
	Close()
1121 1122
}
</pre>
1123

1124
<h3 id="Map_types">Map types</h3>
1125

Rob Pike's avatar
Rob Pike committed
1126 1127
<p>
A map is an unordered group of elements of one type, called the
1128
element type, indexed by a set of unique <i>keys</i> of another type,
1129
called the key type.
1130
The value of an uninitialized map is <code>nil</code>.
Rob Pike's avatar
Rob Pike committed
1131
</p>
1132

1133
<pre class="ebnf">
1134
MapType     = "map" "[" KeyType "]" ElementType .
1135
KeyType     = Type .
1136
</pre>
1137

1138
<p>
Rob Pike's avatar
Rob Pike committed
1139
The comparison operators <code>==</code> and <code>!=</code>
1140 1141 1142
<a href="#Comparison_operators">Comparison operators</a>) must be fully defined
for operands of the key type; thus the key type must not be a struct, array or slice.
If the key type is an interface type, these
Rob Pike's avatar
Rob Pike committed
1143
comparison operators must be defined for the dynamic key values;
Rob Pike's avatar
Rob Pike committed
1144
failure will cause a <a href="#Run_time_panics">run-time panic</a>.
Rob Pike's avatar
Rob Pike committed
1145 1146

</p>
1147

1148
<pre>
1149 1150 1151
map [string] int
map [*T] struct { x, y float }
map [string] interface {}
1152
</pre>
1153

Rob Pike's avatar
Rob Pike committed
1154
<p>
1155 1156 1157 1158
The number of map elements is called its length.
For a map <code>m</code>, it can be discovered using the
built-in function <a href="#Length_and_capacity"><code>len(m)</code></a>
and may change during execution. Values may be added and removed
Rob Pike's avatar
Rob Pike committed
1159
during execution using special forms of <a href="#Assignments">assignment</a>.
Rob Pike's avatar
Rob Pike committed
1160 1161 1162
</p>
<p>
A new, empty map value is made using the built-in
1163 1164
function <a href="#Making_slices_maps_and_channels"><code>make</code></a>,
which takes the map type and an optional capacity hint as arguments:
Rob Pike's avatar
Rob Pike committed
1165
</p>
1166

1167
<pre>
1168 1169
make(map[string] int)
make(map[string] int, 100)
1170
</pre>
1171

1172 1173 1174 1175 1176 1177
<p>
The initial capacity does not bound its size:
maps grow to accommodate the number of items
stored in them.
</p>

1178
<h3 id="Channel_types">Channel types</h3>
1179

Rob Pike's avatar
Rob Pike committed
1180
<p>
1181
A channel provides a mechanism for two concurrently executing functions
Rob Pike's avatar
Rob Pike committed
1182
to synchronize execution and communicate by passing a value of a
1183
specified element type.
1184
The value of an uninitialized channel is <code>nil</code>.
Rob Pike's avatar
Rob Pike committed
1185
</p>
1186

1187
<pre class="ebnf">
1188
ChannelType = ( "chan" [ "&lt;-" ] | "&lt;-" "chan" ) ElementType .
1189
</pre>
1190

1191
<p>
1192 1193 1194 1195 1196
The <code>&lt;-</code> operator specifies the channel <i>direction</i>,
<i>send</i> or <i>receive</i>. If no direction is given, the channel is
<i>bi-directional</i>.
A channel may be constrained only to send or only to receive by
<a href="#Conversions">conversion</a> or <a href="#Assignments">assignment</a>.
1197 1198 1199
</p>

<pre>
1200 1201 1202
chan T         // can be used to send and receive values of type T
chan&lt;- float   // can only be used to send floats
&lt;-chan int     // can only be used to receive ints
1203 1204
</pre>

Rob Pike's avatar
Rob Pike committed
1205
<p>
1206 1207
The <code>&lt;-</code> operator associates with the leftmost <code>chan</code>
possible:
Rob Pike's avatar
Rob Pike committed
1208
</p>
1209

1210
<pre>
1211 1212 1213 1214
chan&lt;- chan int     // same as chan&lt;- (chan int)
chan&lt;- &lt;-chan int   // same as chan&lt;- (&lt;-chan int)
&lt;-chan &lt;-chan int   // same as &lt;-chan (&lt;-chan int)
chan (&lt;-chan int)
1215
</pre>
1216

Rob Pike's avatar
Rob Pike committed
1217
<p>
1218
A new, initialized channel
1219 1220
value can be made using the built-in function
<a href="#Making_slices_maps_and_channels"><code>make</code></a>,
1221
which takes the channel type and an optional capacity as arguments:
Rob Pike's avatar
Rob Pike committed
1222
</p>
1223

1224
<pre>
1225
make(chan int, 100)
1226
</pre>
1227

Rob Pike's avatar
Rob Pike committed
1228 1229
<p>
The capacity, in number of elements, sets the size of the buffer in the channel. If the
Rob Pike's avatar
Rob Pike committed
1230
capacity is greater than zero, the channel is asynchronous: provided the
Rob Pike's avatar
Rob Pike committed
1231 1232 1233
buffer is not full, sends can succeed without blocking. If the capacity is zero
or absent, the communication succeeds only when both a sender and receiver are ready.
</p>
1234

1235
<p>
1236 1237
A channel may be closed and tested for closure with the built-in functions
<a href="#Close_and_closed"><code>close</code> and <code>closed</code></a>.
1238 1239
</p>

1240
<h2 id="Properties_of_types_and_values">Properties of types and values</h2>
1241

1242 1243
<h3 id="Type_identity">Type identity</h3>

1244
<p>
1245
Two types are either <i>identical</i> or <i>different</i>.
1246
</p>
1247

1248
<p>
1249
Two named types are identical if their type names originate in the same
1250
type <a href="#Declarations_and_scope">declaration</a>.
1251
A named and an unnamed type are always different. Two unnamed types are identical
1252
if the corresponding type literals are identical, that is, if they have the same
1253
literal structure and corresponding components have identical types. In detail:
1254
</p>
Rob Pike's avatar
Rob Pike committed
1255

1256
<ul>
1257 1258
	<li>Two array types are identical if they have identical element types and
	    the same array length.</li>
1259

1260
	<li>Two slice types are identical if they have identical element types.</li>
1261

1262
	<li>Two struct types are identical if they have the same sequence of fields,
1263 1264
	    and if corresponding fields have the same names, and identical types,
	    and identical tags.
1265 1266
	    Two anonymous fields are considered to have the same name. Lower-case field
	    names from different packages are always different.</li>
1267

1268
	<li>Two pointer types are identical if they have identical base types.</li>
1269

1270
	<li>Two function types are identical if they have the same number of parameters
Russ Cox's avatar
Russ Cox committed
1271 1272
	    and result values, corresponding parameter and result types are
	    identical, and either both functions are variadic or neither is.
1273
	    Parameter and result names are not required to match.</li>
1274

1275
	<li>Two interface types are identical if they have the same set of methods
1276 1277
	    with the same names and identical function types. Lower-case method names from
	    different packages are always different. The order of the methods is irrelevant.</li>
1278

1279
	<li>Two map types are identical if they have identical key and value types.</li>
1280

1281 1282
	<li>Two channel types are identical if they have identical value types and
	    the same direction.</li>
1283 1284 1285
</ul>

<p>
Rob Pike's avatar
Rob Pike committed
1286 1287
Given the declarations
</p>
1288 1289 1290

<pre>
type (
1291 1292 1293 1294
	T0 []string
	T1 []string
	T2 struct { a, b int }
	T3 struct { a, c int }
Russ Cox's avatar
Russ Cox committed
1295 1296
	T4 func(int, float) *T0
	T5 func(x int, y float) *[]string
1297
)
1298
</pre>
1299

Rob Pike's avatar
Rob Pike committed
1300
<p>
1301
these types are identical:
Rob Pike's avatar
Rob Pike committed
1302
</p>
1303

1304
<pre>
1305
T0 and T0
1306 1307
[]int and []int
struct { a, b *T5 } and struct { a, b *T5 }
Russ Cox's avatar
Russ Cox committed
1308
func(x int, y float) *[]string and func(int, float) (result *[]string)
1309
</pre>
1310

Rob Pike's avatar
Rob Pike committed
1311
<p>
1312 1313 1314 1315
<code>T0</code> and <code>T1</code> are different because they are named types
with distinct declarations; <code>func(int, float) *T0</code> and
<code>func(x int, y float) *[]string</code> are different because <code>T0</code>
is different from <code>[]string</code>.
Rob Pike's avatar
Rob Pike committed
1316
</p>
1317 1318


1319
<h3 id="Assignability">Assignability</h3>
Rob Pike's avatar
Rob Pike committed
1320 1321

<p>
1322 1323
A value <code>x</code> is <i>assignable</i> to a variable of type <code>T</code>
("<code>x</code> is assignable to <code>T</code>") in any of these cases:
Rob Pike's avatar
Rob Pike committed
1324
</p>
1325

Rob Pike's avatar
Rob Pike committed
1326 1327
<ul>
<li>
1328 1329 1330
<code>x</code>'s type is identical to <code>T</code>.
</li>
<li>
Rob Pike's avatar
Rob Pike committed
1331 1332 1333
<code>x</code>'s type <code>V</code> and <code>T</code> have identical
<a href="#Types">underlying types</a> and at least one of <code>V</code>
or <code>T</code> is not a named type.
Robert Griesemer's avatar
Robert Griesemer committed
1334 1335
</li>
<li>
1336
<code>T</code> is an interface type and
1337 1338 1339 1340 1341
<code>x</code> <a href="#Interface_types">implements</a> <code>T</code>.
</li>
<li>
<code>x</code> is a bidirectional channel value, <code>T</code> is a channel type,
<code>x</code>'s type <code>V</code> and <code>T</code> have identical element types,
Rob Pike's avatar
Rob Pike committed
1342
and at least one of <code>V</code> or <code>T</code> is not a named type.
Rob Pike's avatar
Rob Pike committed
1343 1344
</li>
<li>
1345 1346 1347 1348 1349 1350
<code>x</code> is the predeclared identifier <code>nil</code> and <code>T</code>
is a pointer, function, slice, map, channel, or interface type.
</li>
<li>
<code>x</code> is an untyped <a href="#Constants">constant</a> representable
by a value of type <code>T</code>.
Robert Griesemer's avatar
Robert Griesemer committed
1351
</li>
Rob Pike's avatar
Rob Pike committed
1352 1353
</ul>

1354 1355 1356 1357 1358 1359 1360 1361
<p>
If <code>T</code> is a struct type, either all fields of <code>T</code>
must be <a href="#Exported_identifiers">exported</a>, or the assignment must be in
the same package in which <code>T</code> is declared.
In other words, a struct value can be assigned to a struct variable only if
every field of the struct may be legally assigned individually by the program.
</p>

1362 1363 1364 1365
<p>
Any value may be assigned to the <a href="#Blank_identifier">blank identifier</a>.
</p>

1366

1367
<h2 id="Blocks">Blocks</h2>
Robert Griesemer's avatar
Robert Griesemer committed
1368 1369 1370 1371 1372 1373 1374

<p>
A <i>block</i> is a sequence of declarations and statements within matching
brace brackets.
</p>

<pre class="ebnf">
1375
Block = "{" { Statement ";" } "}" .
Robert Griesemer's avatar
Robert Griesemer committed
1376 1377 1378 1379 1380 1381 1382 1383 1384
</pre>

<p>
In addition to explicit blocks in the source code, there are implicit blocks:
</p>

<ol>
	<li>The <i>universe block</i> encompasses all Go source text.</li>

Robert Griesemer's avatar
Robert Griesemer committed
1385
	<li>Each <a href="#Packages">package</a> has a <i>package block</i> containing all
Robert Griesemer's avatar
Robert Griesemer committed
1386 1387 1388 1389 1390 1391 1392 1393
	    Go source text for that package.</li>

	<li>Each file has a <i>file block</i> containing all Go source text
	    in that file.</li>

	<li>Each <code>if</code>, <code>for</code>, and <code>switch</code>
	    statement is considered to be in its own implicit block.</li>

Russ Cox's avatar
Russ Cox committed
1394
	<li>Each clause in a <code>switch</code> or <code>select</code> statement
Robert Griesemer's avatar
Robert Griesemer committed
1395 1396 1397 1398
	    acts as an implicit block.</li>
</ol>

<p>
Robert Griesemer's avatar
Robert Griesemer committed
1399
Blocks nest and influence <a href="#Declarations_and_scope">scoping</a>.
Robert Griesemer's avatar
Robert Griesemer committed
1400 1401 1402
</p>


1403
<h2 id="Declarations_and_scope">Declarations and scope</h2>
1404 1405

<p>
Robert Griesemer's avatar
Robert Griesemer committed
1406 1407
A declaration binds a non-<a href="#Blank_identifier">blank</a>
identifier to a constant, type, variable, function, or package.
1408
Every identifier in a program must be declared.
Robert Griesemer's avatar
Robert Griesemer committed
1409 1410
No identifier may be declared twice in the same block, and
no identifier may be declared in both the file and package block.
1411
</p>
1412

1413
<pre class="ebnf">
Robert Griesemer's avatar
Robert Griesemer committed
1414 1415
Declaration   = ConstDecl | TypeDecl | VarDecl .
TopLevelDecl  = Declaration | FunctionDecl | MethodDecl .
1416
</pre>
1417

1418
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1419 1420
The <i>scope</i> of a declared identifier is the extent of source text in which
the identifier denotes the specified constant, type, variable, function, or package.
1421
</p>
Robert Griesemer's avatar
Robert Griesemer committed
1422

1423
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1424
Go is lexically scoped using blocks:
1425
</p>
Robert Griesemer's avatar
Robert Griesemer committed
1426

1427
<ol>
Robert Griesemer's avatar
Robert Griesemer committed
1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444
	<li>The scope of a predeclared identifier is the universe block.</li>

	<li>The scope of an identifier denoting a constant, type, variable,
	    or function declared at top level (outside any function) is the
	    package block.</li>

	<li>The scope of an imported package identifier is the file block
	    of the file containing the import declaration.</li>

	<li>The scope of an identifier denoting a function parameter or
	    result variable is the function body.</li>

	<li>The scope of a constant or variable identifier declared
	    inside a function begins at the end of the ConstSpec or VarSpec
	    and ends at the end of the innermost containing block.</li>

	<li>The scope of a type identifier declared inside a function
Russ Cox's avatar
Russ Cox committed
1445
	    begins at the identifier in the TypeSpec
Robert Griesemer's avatar
Robert Griesemer committed
1446
	    and ends at the end of the innermost containing block.</li>
1447
</ol>
1448

1449
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1450 1451 1452
An identifier declared in a block may be redeclared in an inner block.
While the identifier of the inner declaration is in scope, it denotes
the entity declared by the inner declaration.
1453
</p>
1454

Robert Griesemer's avatar
Robert Griesemer committed
1455
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1456
The <a href="#Package_clause">package clause</a> is not a declaration; the package name
Robert Griesemer's avatar
Robert Griesemer committed
1457
does not appear in any scope. Its purpose is to identify the files belonging
1458
to the same <a href="#Packages">package</a> and to specify the default package name for import
Robert Griesemer's avatar
Robert Griesemer committed
1459 1460
declarations.
</p>
1461 1462


1463
<h3 id="Label_scopes">Label scopes</h3>
1464

Robert Griesemer's avatar
Robert Griesemer committed
1465
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1466
Labels are declared by <a href="#Labeled_statements">labeled statements</a> and are
Robert Griesemer's avatar
Robert Griesemer committed
1467
used in the <code>break</code>, <code>continue</code>, and <code>goto</code>
1468
statements (§<a href="#Break_statements">Break statements</a>, §<a href="#Continue_statements">Continue statements</a>, §<a href="#Goto_statements">Goto statements</a>).
Robert Griesemer's avatar
Robert Griesemer committed
1469 1470 1471 1472 1473
In contrast to other identifiers, labels are not block scoped and do
not conflict with identifiers that are not labels. The scope of a label
is the body of the function in which it is declared and excludes
the body of any nested function.
</p>
1474 1475


1476
<h3 id="Predeclared_identifiers">Predeclared identifiers</h3>
1477

1478
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1479
The following identifiers are implicitly declared in the universe block:
1480 1481 1482
</p>
<pre class="grammar">
Basic types:
1483 1484
	bool byte complex64 complex128 float32 float64
	int8 int16 int32 int64 string uint8 uint16 uint32 uint64
1485

Rob Pike's avatar
Rob Pike committed
1486
Architecture-specific convenience types:
1487
	complex float int uint uintptr
1488

1489
Constants:
1490 1491 1492 1493
	true false iota

Zero value:
	nil
1494

1495
Functions:
Rob Pike's avatar
Rob Pike committed
1496
	cap close closed cmplx copy imag len make
1497
	new panic print println real recover
1498
</pre>
1499

1500

1501
<h3 id="Exported_identifiers">Exported identifiers</h3>
Robert Griesemer's avatar
Robert Griesemer committed
1502

1503
<p>
1504 1505 1506
An identifier may be <i>exported</i> to permit access to it from another package
using a <a href="#Qualified_identifiers">qualified identifier</a>. An identifier
is exported if both:
1507 1508
</p>
<ol>
1509
	<li>the first character of the identifier's name is a Unicode upper case letter (Unicode class "Lu"); and</li>
Rob Pike's avatar
Rob Pike committed
1510
	<li>the identifier is declared in the <a href="#Blocks">package block</a> or denotes a field or method of a type
1511
	    declared in that block.</li>
1512
</ol>
1513
<p>
1514
All other identifiers are not exported.
1515
</p>
1516

1517

Robert Griesemer's avatar
Robert Griesemer committed
1518 1519 1520 1521 1522 1523 1524 1525
<h3 id="Blank_identifier">Blank identifier</h3>

<p>
The <i>blank identifier</i>, represented by the underscore character <code>_</code>, may be used in a declaration like
any other identifier but the declaration does not introduce a new binding.
</p>


1526
<h3 id="Constant_declarations">Constant declarations</h3>
1527

1528 1529
<p>
A constant declaration binds a list of identifiers (the names of
Robert Griesemer's avatar
Robert Griesemer committed
1530 1531 1532 1533
the constants) to the values of a list of <a href="#Constant_expressions">constant expressions</a>.
The number of identifiers must be equal
to the number of expressions, and the <i>n</i>th identifier on
the left is bound to the value of the <i>n</i>th expression on the
1534 1535
right.
</p>
1536

1537
<pre class="ebnf">
1538
ConstDecl      = "const" ( ConstSpec | "(" { ConstSpec ";" } ")" ) .
1539
ConstSpec      = IdentifierList [ [ Type ] "=" ExpressionList ] .
1540

1541 1542
IdentifierList = identifier { "," identifier } .
ExpressionList = Expression { "," Expression } .
1543
</pre>
1544

1545
<p>
1546
If the type is present, all constants take the type specified, and
1547
the expressions must be <a href="#Assignability">assignable</a> to that type.
1548
If the type is omitted, the constants take the
1549 1550 1551 1552 1553 1554
individual types of the corresponding expressions.
If the expression values are untyped <a href="#Constants">constants</a>,
the declared constants remain untyped and the constant identifiers
denote the constant values. For instance, if the expression is a
floating-point literal, the constant identifier denotes a floating-point
constant, even if the literal's fractional part is zero.
1555
</p>
1556

1557
<pre>
1558
const Pi float64 = 3.14159265358979323846
1559
const zero = 0.0             // untyped floating-point constant
1560
const (
1561 1562
	size int64 = 1024
	eof = -1             // untyped integer constant
1563
)
1564
const a, b, c = 3, 4, "foo"  // a = 3, b = 4, c = "foo", untyped integer and string constants
1565
const u, v float = 0, 3      // u = 0.0, v = 3.0
1566
</pre>
1567

1568 1569 1570 1571
<p>
Within a parenthesized <code>const</code> declaration list the
expression list may be omitted from any but the first declaration.
Such an empty list is equivalent to the textual substitution of the
Rob Pike's avatar
Rob Pike committed
1572
first preceding non-empty expression list and its type if any.
1573 1574 1575
Omitting the list of expressions is therefore equivalent to
repeating the previous list.  The number of identifiers must be equal
to the number of expressions in the previous list.
Robert Griesemer's avatar
Robert Griesemer committed
1576 1577
Together with the <a href="#Iota"><code>iota</code> constant generator</a>
this mechanism permits light-weight declaration of sequential values:
1578
</p>
Robert Griesemer's avatar
Robert Griesemer committed
1579

1580
<pre>
1581
const (
1582 1583 1584 1585 1586 1587 1588 1589
	Sunday = iota
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Partyday
	numberOfDays  // this constant is not exported
1590
)
1591
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
1592 1593


1594
<h3 id="Iota">Iota</h3>
1595

1596
<p>
1597
Within a <a href="#Constant_declarations">constant declaration</a>, the predeclared identifier
1598 1599
<code>iota</code> represents successive untyped integer <a href="#Constants">
constants</a>. It is reset to 0 whenever the reserved word <code>const</code>
1600 1601
appears in the source and increments after each <a href="#ConstSpec">ConstSpec</a>.
It can be used to construct a set of related constants:
1602
</p>
1603

1604
<pre>
Robert Griesemer's avatar
Robert Griesemer committed
1605
const (  // iota is reset to 0
1606 1607 1608
	c0 = iota  // c0 == 0
	c1 = iota  // c1 == 1
	c2 = iota  // c2 == 2
1609 1610 1611
)

const (
1612 1613 1614
	a = 1 &lt;&lt; iota  // a == 1 (iota has been reset)
	b = 1 &lt;&lt; iota  // b == 2
	c = 1 &lt;&lt; iota  // c == 4
1615 1616 1617
)

const (
1618 1619 1620
	u       = iota * 42  // u == 0     (untyped integer constant)
	v float = iota * 42  // v == 42.0  (float constant)
	w       = iota * 42  // w == 84    (untyped integer constant)
1621 1622
)

1623 1624
const x = iota  // x == 0 (iota has been reset)
const y = iota  // y == 0 (iota has been reset)
1625
</pre>
1626

1627
<p>
1628
Within an ExpressionList, the value of each <code>iota</code> is the same because
1629
it is only incremented after each ConstSpec:
1630
</p>
1631

1632
<pre>
1633
const (
1634 1635 1636 1637
	bit0, mask0 = 1 &lt;&lt; iota, 1 &lt;&lt; iota - 1  // bit0 == 1, mask0 == 0
	bit1, mask1                             // bit1 == 2, mask1 == 1
	_, _                                    // skips iota == 2
	bit3, mask3                             // bit3 == 8, mask3 == 7
1638
)
1639
</pre>
1640

1641
<p>
1642 1643 1644
This last example exploits the implicit repetition of the
last non-empty expression list.
</p>
1645 1646


1647
<h3 id="Type_declarations">Type declarations</h3>
1648

1649
<p>
1650
A type declaration binds an identifier, the <i>type name</i>, to a new type
1651 1652 1653
that has the same <a href="#Types">underlying type</a> as
an existing type.  The new type is <a href="#Type_identity">different</a> from
the existing type.
1654
</p>
1655

1656
<pre class="ebnf">
1657
TypeDecl     = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) .
1658
TypeSpec     = identifier Type .
1659
</pre>
1660

1661
<pre>
1662
type IntArray [16]int
1663

1664
type (
1665
	Point struct { x, y float }
1666 1667
	Polar Point
)
1668

1669
type TreeNode struct {
1670 1671
	left, right *TreeNode
	value *Comparable
1672 1673
}

Rob Pike's avatar
Rob Pike committed
1674
type Cipher interface {
1675 1676 1677
	BlockSize() int
	Encrypt(src, dst []byte)
	Decrypt(src, dst []byte)
1678
}
1679
</pre>
1680

1681 1682 1683
<p>
The declared type does not inherit any <a href="#Method_declarations">methods</a>
bound to the existing type, but the <a href="#Types">method set</a>
1684
of an interface type or of elements of a composite type remains unchanged:
1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695
</p>

<pre>
// A Mutex is a data type with two methods Lock and Unlock.
type Mutex struct         { /* Mutex fields */ }
func (m *Mutex) Lock()    { /* Lock implementation */ }
func (m *Mutex) Unlock()  { /* Unlock implementation */ }

// NewMutex has the same composition as Mutex but its method set is empty.
type NewMutex Mutex

Robert Griesemer's avatar
Robert Griesemer committed
1696
// The method set of *PrintableMutex contains the methods
1697
// Lock and Unlock bound to its anonymous field Mutex.
1698
type PrintableMutex struct {
1699
	Mutex
1700
}
1701

1702
// MyCipher is an interface type that has the same method set as Cipher.
1703
type MyCipher Cipher
1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714
</pre>

<p>
A type declaration may be used to define a different boolean, numeric, or string
type and attach methods to it:
</p>

<pre>
type TimeZone int

const (
1715 1716 1717 1718
	EST TimeZone = -(5 + iota)
	CST
	MST
	PST
1719 1720 1721
)

func (tz TimeZone) String() string {
1722
	return fmt.Sprintf("GMT+%dh", tz)
1723 1724 1725 1726
}
</pre>


1727
<h3 id="Variable_declarations">Variable declarations</h3>
1728 1729 1730 1731 1732

<p>
A variable declaration creates a variable, binds an identifier to it and
gives it a type and optionally an initial value.
</p>
1733
<pre class="ebnf">
1734
VarDecl     = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) .
1735
VarSpec     = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
1736
</pre>
1737

1738
<pre>
1739 1740 1741
var i int
var U, V, W float
var k = 0
Rob Pike's avatar
Rob Pike committed
1742
var x, y float = -1, -2
1743
var (
1744
	i int
1745 1746
	u, v, s = 2.0, 3.0, "bar"
)
Robert Griesemer's avatar
Robert Griesemer committed
1747
var re, im = complexSqrt(-1)
1748
var _, found = entries[name]  // map lookup; only interested in "found"
1749
</pre>
1750

1751
<p>
1752
If a list of expressions is given, the variables are initialized
Rob Pike's avatar
Rob Pike committed
1753 1754
by assigning the expressions to the variables (§<a href="#Assignments">Assignments</a>)
in order; all expressions must be consumed and all variables initialized from them.
1755
Otherwise, each variable is initialized to its <a href="#The_zero_value">zero value</a>.
1756
</p>
1757

1758
<p>
1759 1760 1761
If the type is present, each variable is given that type.
Otherwise, the types are deduced from the assignment
of the expression list.
1762
</p>
1763

1764
<p>
1765 1766 1767 1768 1769
If the type is absent and the corresponding expression evaluates to an
untyped <a href="#Constants">constant</a>, the type of the declared variable
is <code>bool</code>, <code>int</code>, <code>float</code>, or <code>string</code>
respectively, depending on whether the value is a boolean, integer,
floating-point, or string constant:
1770
</p>
1771

1772
<pre>
1773
var b = true    // t has type bool
1774
var i = 0       // i has type int
1775
var f = 3.0     // f has type float
1776
var s = "OMDB"  // s has type string
1777
</pre>
1778

1779
<h3 id="Short_variable_declarations">Short variable declarations</h3>
1780

1781
<p>
1782
A <i>short variable declaration</i> uses the syntax:
1783
</p>
1784

1785
<pre class="ebnf">
1786
ShortVarDecl = IdentifierList ":=" ExpressionList .
1787
</pre>
1788

1789
<p>
1790 1791
It is a shorthand for a regular variable declaration with
initializer expressions but no types:
1792
</p>
1793

1794 1795
<pre class="grammar">
"var" IdentifierList = ExpressionList .
1796
</pre>
1797

1798
<pre>
1799 1800 1801 1802 1803
i, j := 0, 10
f := func() int { return 7 }
ch := make(chan int)
r, w := os.Pipe(fd)  // os.Pipe() returns two values
_, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate
1804
</pre>
1805

Rob Pike's avatar
Rob Pike committed
1806
<p>
1807
Unlike regular variable declarations, a short variable declaration may redeclare variables provided they
Rob Pike's avatar
Rob Pike committed
1808
were originally declared in the same block with the same type, and at
Robert Griesemer's avatar
Robert Griesemer committed
1809
least one of the non-<a href="#Blank_identifier">blank</a> variables is new.  As a consequence, redeclaration
Rob Pike's avatar
Rob Pike committed
1810 1811 1812 1813 1814 1815
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.
</p>

<pre>
1816 1817
field1, offset := nextField(str, 0)
field2, offset := nextField(str, offset)  // redeclares offset
Rob Pike's avatar
Rob Pike committed
1818 1819
</pre>

Rob Pike's avatar
Rob Pike committed
1820
<p>
1821 1822 1823
Short variable declarations may appear only inside functions.
In some contexts such as the initializers for <code>if</code>,
<code>for</code>, or <code>switch</code> statements,
1824
they can be used to declare local temporary variables (§<a href="#Statements">Statements</a>).
Rob Pike's avatar
Rob Pike committed
1825
</p>
1826

1827
<h3 id="Function_declarations">Function declarations</h3>
1828

1829
<p>
1830
A function declaration binds an identifier to a function (§<a href="#Function_types">Function types</a>).
1831
</p>
1832

1833
<pre class="ebnf">
Robert Griesemer's avatar
Robert Griesemer committed
1834 1835
FunctionDecl = "func" identifier Signature [ Body ] .
Body         = Block.
1836
</pre>
1837

1838 1839 1840 1841 1842
<p>
A function declaration may omit the body. Such a declaration provides the
signature for a function implemented outside Go, such as an assembly routine.
</p>

1843 1844 1845
<pre>
func min(x int, y int) int {
	if x &lt; y {
1846
		return x
1847
	}
1848
	return y
1849
}
1850 1851

func flushICache(begin, end uintptr)  // implemented externally
1852
</pre>
1853

1854
<h3 id="Method_declarations">Method declarations</h3>
1855

1856
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1857 1858
A method is a function with a <i>receiver</i>.
A method declaration binds an identifier to a method.
Rob Pike's avatar
Rob Pike committed
1859
</p>
1860
<pre class="ebnf">
1861 1862
MethodDecl   = "func" Receiver MethodName Signature [ Body ] .
Receiver     = "(" [ identifier ] [ "*" ] BaseTypeName ")" .
1863
BaseTypeName = identifier .
1864 1865
</pre>

1866
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1867 1868 1869 1870
The receiver type must be of the form <code>T</code> or <code>*T</code> where
<code>T</code> is a type name. <code>T</code> is called the
<i>receiver base type</i> or just <i>base type</i>.
The base type must not be a pointer or interface type and must be
1871
declared in the same package as the method.
1872 1873
The method is said to be <i>bound</i> to the base type
and is visible only within selectors for that type
1874
<a href="#Type_declarations">Type declarations</a>, §<a href="#Selectors">Selectors</a>).
Rob Pike's avatar
Rob Pike committed
1875
</p>
1876

1877 1878 1879
<p>
Given type <code>Point</code>, the declarations
</p>
1880

1881 1882
<pre>
func (p *Point) Length() float {
1883
	return Math.sqrt(p.x * p.x + p.y * p.y)
1884
}
1885

1886
func (p *Point) Scale(factor float) {
1887 1888
	p.x = p.x * factor
	p.y = p.y * factor
1889 1890
}
</pre>
1891

1892
<p>
Rob Pike's avatar
Rob Pike committed
1893 1894
bind the methods <code>Length</code> and <code>Scale</code>,
with receiver type <code>*Point</code>,
1895 1896
to the base type <code>Point</code>.
</p>
1897

1898
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1899
If the receiver's value is not referenced inside the body of the method,
1900 1901 1902
its identifier may be omitted in the declaration. The same applies in
general to parameters of functions and methods.
</p>
1903

Rob Pike's avatar
Rob Pike committed
1904 1905 1906 1907 1908 1909
<p>
The type of a method is the type of a function with the receiver as first
argument.  For instance, the method <code>Scale</code> has type
</p>

<pre>
1910
func(p *Point, factor float)
Rob Pike's avatar
Rob Pike committed
1911 1912 1913 1914 1915 1916
</pre>

<p>
However, a function declared this way is not a method.
</p>

1917

1918
<h2 id="Expressions">Expressions</h2>
1919

1920
<p>
Rob Pike's avatar
Rob Pike committed
1921
An expression specifies the computation of a value by applying
1922
operators and functions to operands.
Rob Pike's avatar
Rob Pike committed
1923
</p>
1924

1925
<h3 id="Operands">Operands</h3>
1926

1927
<p>
1928
Operands denote the elementary values in an expression.
1929
</p>
1930

1931
<pre class="ebnf">
Rob Pike's avatar
Rob Pike committed
1932
Operand    = Literal | QualifiedIdent | MethodExpr | "(" Expression ")" .
Rob Pike's avatar
Rob Pike committed
1933
Literal    = BasicLit | CompositeLit | FunctionLit .
Rob Pike's avatar
Rob Pike committed
1934
BasicLit   = int_lit | float_lit | imaginary_lit | char_lit | string_lit .
1935
</pre>
1936 1937


1938
<h3 id="Qualified_identifiers">Qualified identifiers</h3>
1939

1940
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1941
A qualified identifier is a non-<a href="#Blank_identifier">blank</a> identifier qualified by a package name prefix.
Rob Pike's avatar
Rob Pike committed
1942
</p>
1943

1944
<pre class="ebnf">
Russ Cox's avatar
Russ Cox committed
1945
QualifiedIdent = [ PackageName "." ] identifier .
1946
</pre>
1947

Rob Pike's avatar
Rob Pike committed
1948
<p>
1949 1950 1951
A qualified identifier accesses an identifier in a separate package.
The identifier must be <a href="#Exported_identifiers">exported</a> by that
package, which means that it must begin with a Unicode upper case letter.
Rob Pike's avatar
Rob Pike committed
1952 1953 1954
</p>

<pre>
Rob Pike's avatar
Rob Pike committed
1955
math.Sin
Rob Pike's avatar
Rob Pike committed
1956
</pre>
1957

1958
<!---
Robert Griesemer's avatar
Robert Griesemer committed
1959
<p>
Robert Griesemer's avatar
Robert Griesemer committed
1960
<span class="alert">TODO: Unify this section with Selectors - it's the same syntax.</span>
Robert Griesemer's avatar
Robert Griesemer committed
1961
</p>
1962
--->
Robert Griesemer's avatar
Robert Griesemer committed
1963

1964
<h3 id="Composite_literals">Composite literals</h3>
1965

Rob Pike's avatar
Rob Pike committed
1966 1967 1968 1969
<p>
Composite literals construct values for structs, arrays, slices, and maps
and create a new value each time they are evaluated.
They consist of the type of the value
1970 1971
followed by a brace-bound list of composite elements. An element may be
a single expression or a key-value pair.
Rob Pike's avatar
Rob Pike committed
1972
</p>
Robert Griesemer's avatar
Robert Griesemer committed
1973

1974
<pre class="ebnf">
1975
CompositeLit  = LiteralType "{" [ ElementList [ "," ] ] "}" .
Rob Pike's avatar
Rob Pike committed
1976
LiteralType   = StructType | ArrayType | "[" "..." "]" ElementType |
1977
                SliceType | MapType | TypeName .
1978
ElementList   = Element { "," Element } .
1979
Element       = [ Key ":" ] Value .
1980
Key           = FieldName | ElementIndex .
Rob Pike's avatar
Rob Pike committed
1981
FieldName     = identifier .
1982
ElementIndex  = Expression .
1983
Value         = Expression .
1984
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
1985

Rob Pike's avatar
Rob Pike committed
1986
<p>
1987 1988 1989
The LiteralType must be a struct, array, slice, or map type
(the grammar enforces this constraint except when the type is given
as a TypeName).
1990 1991
The types of the expressions must be <a href="#Assignability">assignable</a>
to the respective field, element, and key types of the LiteralType;
1992
there is no additional conversion.
1993
The key is interpreted as a field name for struct literals,
Rob Pike's avatar
Rob Pike committed
1994
an index expression for array and slice literals, and a key for map literals.
1995 1996 1997
For map literals, all elements must have a key. It is an error
to specify multiple elements with the same field name or
constant key value.
Rob Pike's avatar
Rob Pike committed
1998
</p>
1999

2000 2001
<p>
For struct literals the following rules apply:
2002
</p>
2003
<ul>
2004 2005
	<li>A key must be a field name declared in the LiteralType.
	</li>
Rob Pike's avatar
Rob Pike committed
2006
	<li>A literal that does not contain any keys must
2007 2008 2009 2010 2011
	    list an element for each struct field in the
	    order in which the fields are declared.
	</li>
	<li>If any element has a key, every element must have a key.
	</li>
Rob Pike's avatar
Rob Pike committed
2012
	<li>A literal that contains keys does not need to
2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026
	    have an element for each struct field. Omitted fields
	    get the zero value for that field.
	</li>
	<li>A literal may omit the element list; such a literal evaluates
		to the zero value for its type.
	</li>
	<li>It is an error to specify an element for a non-exported
	    field of a struct belonging to a different package.
	</li>
</ul>

<p>
Given the declarations
</p>
2027
<pre>
2028 2029
type Point struct { x, y, z float }
type Line struct { p, q Point }
2030
</pre>
2031

Rob Pike's avatar
Rob Pike committed
2032 2033 2034
<p>
one may write
</p>
2035

2036
<pre>
2037 2038
origin := Point{}                            // zero value for Point
line := Line{origin, Point{y: -4, z: 12.3}}  // zero value for line.q.x
2039 2040
</pre>

2041 2042 2043
<p>
For array and slice literals the following rules apply:
</p>
2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055
<ul>
	<li>Each element has an associated integer index marking
	    its position in the array.
	</li>
	<li>An element with a key uses the key as its index; the
	    key must be a constant integer expression.
	</li>
	<li>An element without a key uses the previous element's index plus one.
	    If the first element has no key, its index is zero.
	</li>
</ul>

2056
<p>
2057
Taking the address of a composite literal (§<a href="#Address_operators">Address operators</a>)
Rob Pike's avatar
Rob Pike committed
2058
generates a unique pointer to an instance of the literal's value.
2059 2060
</p>
<pre>
2061
var pointer *Point = &amp;Point{y: 1000}
2062
</pre>
2063

Rob Pike's avatar
Rob Pike committed
2064
<p>
2065 2066
The length of an array literal is the length specified in the LiteralType.
If fewer elements than the length are provided in the literal, the missing
Rob Pike's avatar
Rob Pike committed
2067
elements are set to the zero value for the array element type.
2068 2069 2070
It is an error to provide elements with index values outside the index range
of the array. The notation <code>...</code> specifies an array length equal
to the maximum element index plus one.
Rob Pike's avatar
Rob Pike committed
2071
</p>
2072

2073
<pre>
2074 2075 2076
buffer := [10]string{}               // len(buffer) == 10
intSet := [6]int{1, 2, 3, 5}         // len(intSet) == 6
days := [...]string{"Sat", "Sun"}    // len(days) == 2
2077
</pre>
2078

Rob Pike's avatar
Rob Pike committed
2079 2080
<p>
A slice literal describes the entire underlying array literal.
Rob Pike's avatar
Rob Pike committed
2081
Thus, the length and capacity of a slice literal are the maximum
2082
element index plus one. A slice literal has the form
Rob Pike's avatar
Rob Pike committed
2083
</p>
2084

2085
<pre>
2086
[]T{x1, x2, ... xn}
2087
</pre>
2088

Rob Pike's avatar
Rob Pike committed
2089 2090 2091
<p>
and is a shortcut for a slice operation applied to an array literal:
</p>
2092

2093
<pre>
2094
[n]T{x1, x2, ... xn}[0 : n]
2095
</pre>
2096

2097 2098
<p>
A parsing ambiguity arises when a composite literal using the
2099 2100
TypeName form of the LiteralType appears between the
<a href="#Keywords">keyword</a> and the opening brace of the block of an
2101 2102
"if", "for", or "switch" statement, because the braces surrounding
the expressions in the literal are confused with those introducing
2103
the block of statements. To resolve the ambiguity in this rare case,
2104 2105 2106 2107 2108 2109 2110 2111 2112
the composite literal must appear within
parentheses.
</p>

<pre>
if x == (T{a,b,c}[i]) { ... }
if (x == T{a,b,c}[i]) { ... }
</pre>

2113 2114 2115 2116 2117 2118
<p>
Examples of valid array, slice, and map literals:
</p>

<pre>
// list of prime numbers
2119
primes := []int{2, 3, 5, 7, 9, 11, 13, 17, 19, 991}
2120 2121

// vowels[ch] is true if ch is a vowel
2122
vowels := [128]bool{'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'y': true}
2123

2124 2125
// the array [10]float{-1, 0, 0, 0, -0.1, -0.1, 0, 0, 0, -1}
filter := [10]float{-1, 4: -0.1, -0.1, 9: -1}
2126 2127 2128 2129 2130 2131 2132 2133 2134

// frequencies in Hz for equal-tempered scale (A4 = 440Hz)
noteFrequency := map[string]float{
	"C0": 16.35, "D0": 18.35, "E0": 20.60, "F0": 21.83,
	"G0": 24.50, "A0": 27.50, "B0": 30.87,
}
</pre>


2135
<h3 id="Function_literals">Function literals</h3>
2136

Rob Pike's avatar
Rob Pike committed
2137 2138 2139 2140
<p>
A function literal represents an anonymous function.
It consists of a specification of the function type and a function body.
</p>
2141

2142
<pre class="ebnf">
Robert Griesemer's avatar
Robert Griesemer committed
2143
FunctionLit = FunctionType Body .
2144
</pre>
2145

2146
<pre>
Russ Cox's avatar
Russ Cox committed
2147
func(a, b int, z float) bool { return a*b &lt; int(z) }
2148
</pre>
2149

Rob Pike's avatar
Rob Pike committed
2150 2151 2152
<p>
A function literal can be assigned to a variable or invoked directly.
</p>
2153

2154
<pre>
Rob Pike's avatar
Rob Pike committed
2155 2156
f := func(x, y int) int { return x + y }
func(ch chan int) { ch &lt;- ACK } (reply_chan)
2157
</pre>
2158

Rob Pike's avatar
Rob Pike committed
2159 2160
<p>
Function literals are <i>closures</i>: they may refer to variables
2161 2162
defined in a surrounding function. Those variables are then shared between
the surrounding function and the function literal, and they survive as long
Rob Pike's avatar
Rob Pike committed
2163 2164
as they are accessible.
</p>
2165

2166

2167
<h3 id="Primary_expressions">Primary expressions</h3>
2168

2169 2170 2171 2172
<p>
Primary expressions are the operands for unary and binary expressions.
</p>

2173
<pre class="ebnf">
2174 2175
PrimaryExpr =
	Operand |
2176
	Conversion |
2177
	BuiltinCall |
2178 2179 2180
	PrimaryExpr Selector |
	PrimaryExpr Index |
	PrimaryExpr Slice |
2181
	PrimaryExpr TypeAssertion |
2182 2183
	PrimaryExpr Call .

2184 2185
Selector       = "." identifier .
Index          = "[" Expression "]" .
2186
Slice          = "[" Expression ":" [ Expression ] "]" .
2187
TypeAssertion  = "." "(" Type ")" .
2188
Call           = "(" [ ExpressionList [ "," ] ] ")" .
2189 2190 2191 2192 2193 2194 2195 2196
</pre>


<pre>
x
2
(s + ".txt")
f(3.1415, true)
2197
Point{1, 2}
2198 2199 2200 2201 2202 2203 2204 2205
m["foo"]
s[i : j + 1]
obj.color
Math.sin
f.p[i].x()
</pre>


2206
<h3 id="Selectors">Selectors</h3>
2207

Rob Pike's avatar
Rob Pike committed
2208
<p>
Robert Griesemer's avatar
Robert Griesemer committed
2209
A primary expression of the form
Rob Pike's avatar
Rob Pike committed
2210
</p>
Robert Griesemer's avatar
Robert Griesemer committed
2211

2212 2213 2214
<pre>
x.f
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
2215

2216
<p>
Rob Pike's avatar
Rob Pike committed
2217 2218 2219 2220
denotes the field or method <code>f</code> of the value denoted by <code>x</code>
(or of <code>*x</code> if
<code>x</code> is of pointer type). The identifier <code>f</code>
is called the (field or method)
Robert Griesemer's avatar
Robert Griesemer committed
2221
<i>selector</i>; it must not be the <a href="#Blank_identifier">blank identifier</a>.
Rob Pike's avatar
Rob Pike committed
2222 2223
The type of the expression is the type of <code>f</code>.
</p>
2224
<p>
Rob Pike's avatar
Rob Pike committed
2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236
A selector <code>f</code> may denote a field or method <code>f</code> of
a type <code>T</code>, or it may refer
to a field or method <code>f</code> of a nested anonymous field of
<code>T</code>.
The number of anonymous fields traversed
to reach <code>f</code> is called its <i>depth</i> in <code>T</code>.
The depth of a field or method <code>f</code>
declared in <code>T</code> is zero.
The depth of a field or method <code>f</code> declared in
an anonymous field <code>A</code> in <code>T</code> is the
depth of <code>f</code> in <code>A</code> plus one.
</p>
2237
<p>
2238
The following rules apply to selectors:
Rob Pike's avatar
Rob Pike committed
2239 2240 2241 2242 2243 2244 2245 2246 2247
</p>
<ol>
<li>
For a value <code>x</code> of type <code>T</code> or <code>*T</code>
where <code>T</code> is not an interface type,
<code>x.f</code> denotes the field or method at the shallowest depth
in <code>T</code> where there
is such an <code>f</code>.
If there is not exactly one <code>f</code> with shallowest depth, the selector
2248
expression is illegal.
Rob Pike's avatar
Rob Pike committed
2249 2250 2251 2252 2253 2254 2255 2256 2257 2258
</li>
<li>
For a variable <code>x</code> of type <code>I</code> or <code>*I</code>
where <code>I</code> is an interface type,
<code>x.f</code> denotes the actual method with name <code>f</code> of the value assigned
to <code>x</code> if there is such a method.
If no value or <code>nil</code> was assigned to <code>x</code>, <code>x.f</code> is illegal.
</li>
<li>
In all other cases, <code>x.f</code> is illegal.
2259
</li>
Rob Pike's avatar
Rob Pike committed
2260
</ol>
2261
<p>
Rob Pike's avatar
Rob Pike committed
2262
Selectors automatically dereference pointers.
Rob Pike's avatar
Rob Pike committed
2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273
If <code>x</code> is of pointer type, <code>x.y</code>
is shorthand for <code>(*x).y</code>; if <code>y</code>
is also of pointer type, <code>x.y.z</code> is shorthand
for <code>(*(*x).y).z</code>, and so on.
If <code>*x</code> is of pointer type, dereferencing
must be explicit;
only one level of automatic dereferencing is provided.
For an <code>x</code> of type <code>T</code> containing an
anonymous field declared as <code>*A</code>,
<code>x.f</code> is a shortcut for <code>(*x.A).f</code>.
</p>
2274
<p>
Rob Pike's avatar
Rob Pike committed
2275 2276
For example, given the declarations:
</p>
2277

2278 2279
<pre>
type T0 struct {
2280
	x int
2281
}
2282

2283
func (recv *T0) M0()
2284

2285
type T1 struct {
2286
	y int
2287
}
2288

2289
func (recv T1) M1()
2290

2291
type T2 struct {
2292 2293 2294
	z int
	T1
	*T0
2295
}
Robert Griesemer's avatar
Robert Griesemer committed
2296

2297
func (recv *T2) M2()
Robert Griesemer's avatar
Robert Griesemer committed
2298

2299
var p *T2  // with p != nil and p.T1 != nil
2300
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
2301

Rob Pike's avatar
Rob Pike committed
2302 2303 2304
<p>
one may write:
</p>
Robert Griesemer's avatar
Robert Griesemer committed
2305

2306 2307 2308 2309
<pre>
p.z         // (*p).z
p.y         // ((*p).T1).y
p.x         // (*(*p).T0).x
Robert Griesemer's avatar
Robert Griesemer committed
2310

2311 2312 2313 2314
p.M2        // (*p).M2
p.M1        // ((*p).T1).M1
p.M0        // ((*p).T0).M0
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
2315 2316


2317
<!---
Robert Griesemer's avatar
Robert Griesemer committed
2318
<span class="alert">
2319
TODO: Specify what happens to receivers.
Robert Griesemer's avatar
Robert Griesemer committed
2320
</span>
2321
--->
Robert Griesemer's avatar
Robert Griesemer committed
2322

2323

2324
<h3 id="Indexes">Indexes</h3>
2325

Rob Pike's avatar
Rob Pike committed
2326
<p>
Robert Griesemer's avatar
Robert Griesemer committed
2327
A primary expression of the form
Rob Pike's avatar
Rob Pike committed
2328
</p>
Robert Griesemer's avatar
Robert Griesemer committed
2329

2330 2331 2332
<pre>
a[x]
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
2333

Rob Pike's avatar
Rob Pike committed
2334
<p>
Rob Pike's avatar
Rob Pike committed
2335
denotes the element of the array, slice, string or map <code>a</code> indexed by <code>x</code>.
Rob Pike's avatar
Rob Pike committed
2336
The value <code>x</code> is called the
Rob Pike's avatar
Rob Pike committed
2337
<i>index</i> or <i>map key</i>, respectively. The following
Robert Griesemer's avatar
Robert Griesemer committed
2338
rules apply:
Rob Pike's avatar
Rob Pike committed
2339
</p>
2340

2341
<p>
Rob Pike's avatar
Rob Pike committed
2342
For <code>a</code> of type <code>A</code> or <code>*A</code>
Robert Griesemer's avatar
Robert Griesemer committed
2343 2344
where <code>A</code> is an <a href="#Array_types">array type</a>,
or for <code>a</code> of type <code>S</code> where <code>S</code> is a <a href="#Slice_types">slice type</a>:
Rob Pike's avatar
Rob Pike committed
2345
</p>
2346
<ul>
2347
	<li><code>x</code> must be an integer value and <code>0 &lt;= x &lt; len(a)</code></li>
Rob Pike's avatar
Rob Pike committed
2348
	<li><code>a[x]</code> is the array element at index <code>x</code> and the type of
2349
	  <code>a[x]</code> is the element type of <code>A</code></li>
Rob Pike's avatar
Rob Pike committed
2350 2351
	<li>if the index <code>x</code> is out of range,
	a <a href="#Run_time_panics">run-time panic</a> occurs</li>
2352
</ul>
2353 2354 2355

<p>
For <code>a</code> of type <code>T</code>
2356
where <code>T</code> is a <a href="#String_types">string type</a>:
2357 2358
</p>
<ul>
2359
	<li><code>x</code> must be an integer value and <code>0 &lt;= x &lt; len(a)</code></li>
2360
	<li><code>a[x]</code> is the byte at index <code>x</code> and the type of
2361
	  <code>a[x]</code> is <code>byte</code></li>
2362
	<li><code>a[x]</code> may not be assigned to</li>
Rob Pike's avatar
Rob Pike committed
2363 2364
	<li>if the index <code>x</code> is out of range,
	a <a href="#Run_time_panics">run-time panic</a> occurs</li>
2365 2366
</ul>

2367
<p>
2368
For <code>a</code> of type <code>M</code>
Robert Griesemer's avatar
Robert Griesemer committed
2369
where <code>M</code> is a <a href="#Map_types">map type</a>:
Rob Pike's avatar
Rob Pike committed
2370
</p>
2371
<ul>
2372
	<li><code>x</code>'s type must be
2373 2374
	<a href="#Assignability">assignable</a>
	to the key type of <code>M</code></li>
2375 2376 2377 2378 2379 2380
	<li>if the map contains an entry with key <code>x</code>,
	  <code>a[x]</code> is the map value with key <code>x</code>
	  and the type of <code>a[x]</code> is the value type of <code>M</code></li>
	<li>if the map does not contain such an entry,
	  <code>a[x]</code> is the <a href="#The_zero_value">zero value</a>
	  for the value type of <code>M</code></li>
2381
</ul>
Robert Griesemer's avatar
Robert Griesemer committed
2382

2383
<p>
2384
Otherwise <code>a[x]</code> is illegal.
Rob Pike's avatar
Rob Pike committed
2385 2386 2387
</p>

<p>
2388 2389
An index expression on a map <code>a</code> of type <code>map[K]V</code>
may be used in an assignment or initialization of the special form
Rob Pike's avatar
Rob Pike committed
2390 2391 2392
</p>

<pre>
2393 2394 2395
v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
Rob Pike's avatar
Rob Pike committed
2396 2397 2398
</pre>

<p>
2399 2400 2401 2402 2403
where the result of the index expression is a pair of values with types
<code>(V, bool)</code>. In this form, the value of <code>ok</code> is
<code>true</code> if the key <code>x</code> is present in the map, and
<code>false</code> otherwise. The value of <code>v</code> is the value
<code>a[x]</code> as in the single-result form.
Rob Pike's avatar
Rob Pike committed
2404 2405 2406 2407 2408
</p>

<p>
Similarly, if an assignment to a map has the special form
</p>
Robert Griesemer's avatar
Robert Griesemer committed
2409

Rob Pike's avatar
Rob Pike committed
2410
<pre>
2411
a[x] = v, ok
Rob Pike's avatar
Rob Pike committed
2412 2413 2414 2415 2416 2417 2418 2419
</pre>

<p>
and boolean <code>ok</code> has the value <code>false</code>,
the entry for key <code>x</code> is deleted from the map; if
<code>ok</code> is <code>true</code>, the construct acts like
a regular assignment to an element of the map.
</p>
2420

2421

2422
<h3 id="Slices">Slices</h3>
2423

Rob Pike's avatar
Rob Pike committed
2424
<p>
2425
For a string, array, or slice <code>a</code>, the primary expression
Rob Pike's avatar
Rob Pike committed
2426
</p>
2427

2428
<pre>
2429
a[lo : hi]
2430
</pre>
2431

Rob Pike's avatar
Rob Pike committed
2432
<p>
2433 2434 2435 2436 2437 2438 2439 2440
constructs a substring or slice. The index expressions <code>lo</code> and
<code>hi</code> select which elements appear in the result. The result has
indexes starting at 0 and length equal to
<code>hi</code>&nbsp;-&nbsp;<code>lo</code>.
After slicing the array <code>a</code>
</p>

<pre>
2441 2442
a := [5]int{1, 2, 3, 4, 5}
s := a[1:4]
2443 2444 2445 2446
</pre>

<p>
the slice <code>s</code> has type <code>[]int</code>, length 3, capacity 4, and elements
Rob Pike's avatar
Rob Pike committed
2447
</p>
2448

2449 2450 2451
<pre>
s[0] == 2
s[1] == 3
2452
s[2] == 4
2453
</pre>
2454

Rob Pike's avatar
Rob Pike committed
2455
<p>
2456 2457
For convenience, the <code>hi</code> expression may be omitted; the notation
<code>a[lo :]</code> is shorthand for <code>a[lo : len(a)]</code>.
2458
For arrays or strings, the indexes
Rob Pike's avatar
Rob Pike committed
2459 2460
<code>lo</code> and <code>hi</code> must satisfy
0 &lt;= <code>lo</code> &lt;= <code>hi</code> &lt;= length;
2461
for slices, the upper bound is the capacity rather than the length.
2462 2463
</p>

2464
<p>
2465 2466 2467 2468
If the sliced operand is a string or slice, the result of the slice operation
is a string or slice of the same type.
If the sliced operand is an array, the result of the slice operation is a slice
with the same element type as the array.
Rob Pike's avatar
Rob Pike committed
2469
</p>
2470 2471


2472
<h3 id="Type_assertions">Type assertions</h3>
2473

Rob Pike's avatar
Rob Pike committed
2474
<p>
Robert Griesemer's avatar
Robert Griesemer committed
2475 2476
For an expression <code>x</code> of <a href="#Interface_types">interface type</a>
and a type <code>T</code>, the primary expression
Rob Pike's avatar
Rob Pike committed
2477
</p>
2478

2479 2480 2481
<pre>
x.(T)
</pre>
2482

2483
<p>
Robert Griesemer's avatar
Robert Griesemer committed
2484
asserts that <code>x</code> is not <code>nil</code>
Russ Cox's avatar
Russ Cox committed
2485
and that the value stored in <code>x</code> is of type <code>T</code>.
2486
The notation <code>x.(T)</code> is called a <i>type assertion</i>.
Rob Pike's avatar
Rob Pike committed
2487 2488
</p>
<p>
2489
More precisely, if <code>T</code> is not an interface type, <code>x.(T)</code> asserts
2490 2491
that the dynamic type of <code>x</code> is <a href="#Type_identity">identical</a>
to the type <code>T</code>.
2492
If <code>T</code> is an interface type, <code>x.(T)</code> asserts that the dynamic type
Rob Pike's avatar
Rob Pike committed
2493
of <code>x</code> implements the interface <code>T</code><a href="#Interface_types">Interface types</a>).
Rob Pike's avatar
Rob Pike committed
2494
</p>
2495
<p>
2496
If the type assertion holds, the value of the expression is the value
Rob Pike's avatar
Rob Pike committed
2497 2498 2499
stored in <code>x</code> and its type is <code>T</code>. If the type assertion is false,
a <a href="#Run_time_panics">run-time panic</a> occurs.
In other words, even though the dynamic type of <code>x</code>
2500
is known only at run-time, the type of <code>x.(T)</code> is
Rob Pike's avatar
Rob Pike committed
2501 2502
known to be <code>T</code> in a correct program.
</p>
2503
<p>
Rob Pike's avatar
Rob Pike committed
2504
If a type assertion is used in an assignment or initialization of the form
Rob Pike's avatar
Rob Pike committed
2505
</p>
2506

2507 2508 2509
<pre>
v, ok = x.(T)
v, ok := x.(T)
Rob Pike's avatar
Rob Pike committed
2510
var v, ok = x.(T)
2511
</pre>
2512

2513
<p>
2514 2515
the result of the assertion is a pair of values with types <code>(T, bool)</code>.
If the assertion holds, the expression returns the pair <code>(x.(T), true)</code>;
Rob Pike's avatar
Rob Pike committed
2516
otherwise, the expression returns <code>(Z, false)</code> where <code>Z</code>
Robert Griesemer's avatar
Robert Griesemer committed
2517
is the <a href="#The_zero_value">zero value</a> for type <code>T</code>.
Rob Pike's avatar
Rob Pike committed
2518
No run-time panic occurs in this case.
2519
The type assertion in this construct thus acts like a function call
2520
returning a value and a boolean indicating success.  (§<a href="#Assignments">Assignments</a>)
Rob Pike's avatar
Rob Pike committed
2521
</p>
2522

2523

2524
<h3 id="Calls">Calls</h3>
2525

2526
<p>
Rob Pike's avatar
Rob Pike committed
2527 2528
Given an expression <code>f</code> of function type
<code>F</code>,
Rob Pike's avatar
Rob Pike committed
2529
</p>
2530

2531
<pre>
Rob Pike's avatar
Rob Pike committed
2532
f(a1, a2, ... an)
2533
</pre>
2534

2535
<p>
Rob Pike's avatar
Rob Pike committed
2536
calls <code>f</code> with arguments <code>a1, a2, ... an</code>.
2537
Except for one special case, arguments must be single-valued expressions
2538
<a href="#Assignability">assignable</a> to the parameter types of
Rob Pike's avatar
Rob Pike committed
2539 2540 2541 2542 2543 2544 2545
<code>F</code> and are evaluated before the function is called.
The type of the expression is the result type
of <code>F</code>.
A method invocation is similar but the method itself
is specified as a selector upon a value of the receiver type for
the method.
</p>
2546

2547
<pre>
Robert Griesemer's avatar
Robert Griesemer committed
2548
math.Atan2(x, y)    // function call
2549
var pt *Point
Rob Pike's avatar
Rob Pike committed
2550
pt.Scale(3.5)  // method call with receiver pt
2551
</pre>
2552

2553 2554
<p>
As a special case, if the return parameters of a function or method
2555 2556
<code>g</code> are equal in number and individually
assignable to the parameters of another function or method
2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567
<code>f</code>, then the call <code>f(g(<i>parameters_of_g</i>))</code>
will invoke <code>f</code> after binding the return values of
<code>g</code> to the parameters of <code>f</code> in order.  The call
of <code>f</code> must contain no parameters other than the call of <code>g</code>.
If <code>f</code> has a final <code>...</code> parameter, it is
assigned the return values of <code>g</code> that remain after
assignment of regular parameters.
</p>

<pre>
func Split(s string, pos int) (string, string) {
2568
	return s[0:pos], s[pos:]
2569 2570 2571 2572 2573 2574 2575
}

func Join(s, t string) string {
	return s + t
}

if Join(Split(value, len(value)/2)) != value {
2576
	log.Crash("test fails")
2577 2578 2579
}
</pre>

Rob Pike's avatar
Rob Pike committed
2580
<p>
Robert Griesemer's avatar
Robert Griesemer committed
2581
A method call <code>x.m()</code> is valid if the method set of
Rob Pike's avatar
Rob Pike committed
2582
(the type of) <code>x</code> contains <code>m</code> and the
2583
argument list can be assigned to the parameter list of <code>m</code>.
Rob Pike's avatar
Rob Pike committed
2584
If <code>x</code> is <a href="#Address_operators">addressable</a> and <code>&amp;x</code>'s method
Robert Griesemer's avatar
Robert Griesemer committed
2585 2586
set contains <code>m</code>, <code>x.m()</code> is shorthand
for <code>(&amp;x).m()</code>:
Rob Pike's avatar
Rob Pike committed
2587
</p>
2588

2589
<pre>
2590
var p Point
Rob Pike's avatar
Rob Pike committed
2591
p.Scale(3.5)
2592
</pre>
2593

2594
<p>
2595
There is no distinct method type and there are no method literals.
Rob Pike's avatar
Rob Pike committed
2596
</p>
2597

2598
<h3 id="Passing_arguments_to_..._parameters">Passing arguments to <code>...</code> parameters</h3>
2599

Rob Pike's avatar
Rob Pike committed
2600
<p>
Russ Cox's avatar
Russ Cox committed
2601 2602 2603 2604 2605
If <code>f</code> is variadic with final parameter type <code>...T</code>,
then within the function the argument is equivalent to a parameter of type
<code>[]T</code>.  At each call of <code>f</code>, the argument
passed to the final parameter is
a new slice of type <code>[]T</code> whose successive elements are
2606
the actual arguments.  The length of the slice is therefore the
Russ Cox's avatar
Russ Cox committed
2607
number of arguments bound to the final parameter and
2608 2609
may differ for each call site.
</p>
2610

Rob Pike's avatar
Rob Pike committed
2611
<p>
2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625
Given the function and call
</p>
<pre>
func Greeting(prefix string, who ... string)
Greeting("hello:", "Joe", "Anna", "Eileen")
</pre>

<p>
Within <code>Greeting</code>, <code>who</code> will have value
<code>[]string{"Joe", "Anna", "Eileen")</code>
</p>


<p>
Russ Cox's avatar
Russ Cox committed
2626 2627 2628 2629
As a special case, if a function passes its own <code>...</code> parameter
as the <code>...</code> argument in a call to another function with
a <code>...</code> parameter of <a href="#Type_identity">identical type</a>,
the parameter is passed directly.  In short, a formal <code>...</code>
2630 2631 2632
parameter is passed unchanged as an actual <code>...</code> parameter provided the
types match.
</p>
2633

2634
<h3 id="Operators">Operators</h3>
2635

Rob Pike's avatar
Rob Pike committed
2636
<p>
2637
Operators combine operands into expressions.
Rob Pike's avatar
Rob Pike committed
2638
</p>
2639

2640
<pre class="ebnf">
2641
Expression = UnaryExpr | Expression binary_op UnaryExpr .
Rob Pike's avatar
Rob Pike committed
2642
UnaryExpr  = PrimaryExpr | unary_op UnaryExpr .
2643

Rob Pike's avatar
Rob Pike committed
2644 2645 2646 2647 2648
binary_op  = log_op | com_op | rel_op | add_op | mul_op .
log_op     = "||" | "&amp;&amp;" .
com_op     = "&lt;-" .
rel_op     = "==" | "!=" | "&lt;" | "&lt;=" | ">" | ">=" .
add_op     = "+" | "-" | "|" | "^" .
Robert Griesemer's avatar
Robert Griesemer committed
2649
mul_op     = "*" | "/" | "%" | "&lt;&lt;" | "&gt;&gt;" | "&amp;" | "&amp;^" .
2650

Rob Pike's avatar
Rob Pike committed
2651
unary_op   = "+" | "-" | "!" | "^" | "*" | "&amp;" | "&lt;-" .
2652
</pre>
2653

2654
<p>
2655
Comparisons are discussed <a href="#Comparison_operators">elsewhere</a>.
2656
For other binary operators, the operand types must be <a href="#Type_identity">identical</a>
2657 2658 2659
unless the operation involves channels, shifts, or untyped <a href="#Constants">constants</a>.
For operations involving constants only, see the section on
<a href="#Constant_expressions">constant expressions</a>.
Rob Pike's avatar
Rob Pike committed
2660
</p>
2661

2662
<p>
2663
In a channel send, the first operand is always a channel and the second
2664 2665
must be a value <a href="#Assignability">assignable</a>
to the channel's element type.
2666
</p>
2667

2668 2669
<p>
Except for shift operations,
2670 2671 2672
if one operand is an untyped <a href="#Constants">constant</a>
and the other operand is not, the constant is <a href="#Conversions">converted</a>
to the type of the other operand.
2673
</p>
2674

2675 2676
<p>
The right operand in a shift operation must have unsigned integer type
2677
or be an untyped constant that can be converted to unsigned integer type.
2678
</p>
Rob Pike's avatar
Rob Pike committed
2679

2680
<p>
2681 2682 2683
If the left operand of a non-constant shift operation is an untyped constant,
the type of constant is what it would be if the shift operation were replaced by
the left operand alone.
2684
</p>
2685

2686
<pre>
2687 2688 2689 2690 2691 2692
var s uint = 33
var i = 1&lt;&lt;s          // 1 has type int
var j = int32(1&lt;&lt;s)   // 1 has type int32; j == 0
var u = uint64(1&lt;&lt;s)  // 1 has type uint64; u == 1&lt;&lt;33
var f = float(1&lt;&lt;s)   // illegal: 1 has type float, cannot shift
var g = float(1&lt;&lt;33)  // legal; 1&lt;&lt;33 is a constant shift operation; g == 1&lt;&lt;33
2693
</pre>
2694

2695
<h3 id="Operator_precedence">Operator precedence</h3>
2696
<p>
Russ Cox's avatar
Russ Cox committed
2697 2698
Unary operators have the highest precedence.
As the  <code>++</code> and <code>--</code> operators form
Rob Pike's avatar
Rob Pike committed
2699
statements, not expressions, they fall
Russ Cox's avatar
Russ Cox committed
2700
outside the operator hierarchy.
Rob Pike's avatar
Rob Pike committed
2701 2702 2703 2704
As a consequence, statement <code>*p++</code> is the same as <code>(*p)++</code>.
<p>
There are six precedence levels for binary operators.
Multiplication operators bind strongest, followed by addition
2705
operators, comparison operators, <code>&lt;-</code> (channel send),
Rob Pike's avatar
Rob Pike committed
2706 2707
<code>&amp;&amp;</code> (logical and), and finally <code>||</code> (logical or):
</p>
2708

Rob Pike's avatar
Rob Pike committed
2709
<pre class="grammar">
2710
Precedence    Operator
Robert Griesemer's avatar
Robert Griesemer committed
2711
    6             *  /  %  &lt;&lt;  &gt;&gt;  &amp;  &amp;^
2712 2713 2714 2715 2716 2717
    5             +  -  |  ^
    4             ==  !=  &lt;  &lt;=  >  >=
    3             &lt;-
    2             &amp;&amp;
    1             ||
</pre>
2718

Rob Pike's avatar
Rob Pike committed
2719
<p>
2720
Binary operators of the same precedence associate from left to right.
2721
For instance, <code>x / y * z</code> is the same as <code>(x / y) * z</code>.
Rob Pike's avatar
Rob Pike committed
2722
</p>
2723

2724 2725 2726 2727
<pre>
+x
23 + 3*x[i]
x &lt;= f()
Robert Griesemer's avatar
Robert Griesemer committed
2728
^a &gt;&gt; b
2729
f() || g()
2730
x == y+1 &amp;&amp; &lt;-chan_ptr > 0
2731
</pre>
2732 2733


2734
<h3 id="Arithmetic_operators">Arithmetic operators</h3>
2735
<p>
2736
Arithmetic operators apply to numeric values and yield a result of the same
Rob Pike's avatar
Rob Pike committed
2737
type as the first operand. The four standard arithmetic operators (<code>+</code>,
Rob Pike's avatar
Rob Pike committed
2738 2739
<code>-</code>,  <code>*</code>, <code>/</code>) apply to integer,
floating-point, and complex types; <code>+</code> also applies
2740
to strings. All other arithmetic operators apply to integers only.
Rob Pike's avatar
Rob Pike committed
2741
</p>
2742

Rob Pike's avatar
Rob Pike committed
2743
<pre class="grammar">
Rob Pike's avatar
Rob Pike committed
2744 2745 2746 2747
+    sum                    integers, floats, complex values, strings
-    difference             integers, floats, complex values
*    product                integers, floats, complex values
/    quotient               integers, floats, complex values
2748
%    remainder              integers
2749

2750 2751 2752 2753
&amp;    bitwise and            integers
|    bitwise or             integers
^    bitwise xor            integers
&amp;^   bit clear (and not)    integers
2754

Robert Griesemer's avatar
Robert Griesemer committed
2755 2756
&lt;&lt;   left shift             integer &lt;&lt; unsigned integer
&gt;&gt;   right shift            integer &gt;&gt; unsigned integer
2757
</pre>
2758

Rob Pike's avatar
Rob Pike committed
2759 2760 2761 2762
<p>
Strings can be concatenated using the <code>+</code> operator
or the <code>+=</code> assignment operator:
</p>
2763

2764
<pre>
2765 2766
s := "hi" + string(c)
s += " and good bye"
2767
</pre>
2768

2769
<p>
Rob Pike's avatar
Rob Pike committed
2770 2771 2772 2773 2774
String addition creates a new string by concatenating the operands.
</p>
<p>
For integer values, <code>/</code> and <code>%</code> satisfy the following relationship:
</p>
2775

2776 2777 2778
<pre>
(a / b) * b + a % b == a
</pre>
2779

Rob Pike's avatar
Rob Pike committed
2780 2781 2782
<p>
with <code>(a / b)</code> truncated towards zero.
</p>
2783

2784 2785 2786 2787 2788 2789 2790
<pre>
 x     y     x / y     x % y
 5     3       1         2
-5     3      -1        -2
 5    -3      -1         2
-5    -3       1        -2
</pre>
2791

Rob Pike's avatar
Rob Pike committed
2792
<p>
2793
If the divisor is zero, a <a href="#Run_time_panics">run-time panic</a> occurs.
Rob Pike's avatar
Rob Pike committed
2794
If the dividend is positive and the divisor is a constant power of 2,
2795
the division may be replaced by a right shift, and computing the remainder may
2796
be replaced by a bitwise "and" operation:
Rob Pike's avatar
Rob Pike committed
2797
</p>
2798

2799
<pre>
Robert Griesemer's avatar
Robert Griesemer committed
2800
 x     x / 4     x % 4     x &gt;&gt; 2     x &amp; 3
2801 2802 2803
 11      2         3         2          3
-11     -2        -3        -3          1
</pre>
2804

Rob Pike's avatar
Rob Pike committed
2805
<p>
2806 2807
The shift operators shift the left operand by the shift count specified by the
right operand. They implement arithmetic shifts if the left operand is a signed
Rob Pike's avatar
Rob Pike committed
2808 2809 2810 2811
integer and logical shifts if it is an unsigned integer. The shift count must
be an unsigned integer. There is no upper limit on the shift count. Shifts behave
as if the left operand is shifted <code>n</code> times by 1 for a shift
count of <code>n</code>.
Robert Griesemer's avatar
Robert Griesemer committed
2812 2813
As a result, <code>x &lt;&lt; 1</code> is the same as <code>x*2</code>
and <code>x &gt;&gt; 1</code> is the same as
Robert Griesemer's avatar
Robert Griesemer committed
2814
<code>x/2</code> but truncated towards negative infinity.
Rob Pike's avatar
Rob Pike committed
2815
</p>
2816

Rob Pike's avatar
Rob Pike committed
2817 2818 2819
<p>
For integer operands, the unary operators
<code>+</code>, <code>-</code>, and <code>^</code> are defined as
Robert Griesemer's avatar
Robert Griesemer committed
2820
follows:
Rob Pike's avatar
Rob Pike committed
2821
</p>
2822

Rob Pike's avatar
Rob Pike committed
2823
<pre class="grammar">
2824 2825
+x                          is 0 + x
-x    negation              is 0 - x
Russ Cox's avatar
Russ Cox committed
2826 2827
^x    bitwise complement    is m ^ x  with m = "all bits set to 1" for unsigned x
                                      and  m = -1 for signed x
2828
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
2829

2830
<p>
2831
For floating-point numbers,
2832 2833
<code>+x</code> is the same as <code>x</code>,
while <code>-x</code> is the negation of <code>x</code>.
2834 2835 2836
The result of a floating-point division by zero is not specified beyond the
IEEE-754 standard; whether a <a href="#Run_time_panics">run-time panic</a>
occurs is implementation-specific.
2837
</p>
Robert Griesemer's avatar
Robert Griesemer committed
2838

2839
<h3 id="Integer_overflow">Integer overflow</h3>
Robert Griesemer's avatar
Robert Griesemer committed
2840

Rob Pike's avatar
Rob Pike committed
2841 2842 2843 2844 2845
<p>
For unsigned integer values, the operations <code>+</code>,
<code>-</code>, <code>*</code>, and <code>&lt;&lt;</code> are
computed modulo 2<sup><i>n</i></sup>, where <i>n</i> is the bit width of
the unsigned integer's type
2846
<a href="#Numeric_types">Numeric types</a>). Loosely speaking, these unsigned integer operations
Robert Griesemer's avatar
Robert Griesemer committed
2847
discard high bits upon overflow, and programs may rely on ``wrap around''.
Rob Pike's avatar
Rob Pike committed
2848
</p>
2849
<p>
Rob Pike's avatar
Rob Pike committed
2850 2851
For signed integers, the operations <code>+</code>,
<code>-</code>, <code>*</code>, and <code>&lt;&lt;</code> may legally
Robert Griesemer's avatar
Robert Griesemer committed
2852 2853
overflow and the resulting value exists and is deterministically defined
by the signed integer representation, the operation, and its operands.
Rob Pike's avatar
Rob Pike committed
2854
No exception is raised as a result of overflow. A
Robert Griesemer's avatar
Robert Griesemer committed
2855
compiler may not optimize code under the assumption that overflow does
Rob Pike's avatar
Rob Pike committed
2856 2857
not occur. For instance, it may not assume that <code>x &lt; x + 1</code> is always true.
</p>
2858 2859


2860
<h3 id="Comparison_operators">Comparison operators</h3>
2861

Rob Pike's avatar
Rob Pike committed
2862
<p>
2863
Comparison operators compare two operands and yield a value of type <code>bool</code>.
Rob Pike's avatar
Rob Pike committed
2864
</p>
2865

Rob Pike's avatar
Rob Pike committed
2866
<pre class="grammar">
2867 2868 2869 2870 2871 2872 2873
==    equal
!=    not equal
<     less
<=    less or equal
>     greater
>=    greater or equal
</pre>
2874

Rob Pike's avatar
Rob Pike committed
2875
<p>
2876
The operands must be <i>comparable</i>; that is, the first operand
2877 2878
must be <a href="#Assignability">assignable</a>
to the type of the second operand, or vice versa.
Rob Pike's avatar
Rob Pike committed
2879
</p>
2880
<p>
2881 2882 2883 2884
The operators <code>==</code> and <code>!=</code> apply
to operands of all types except arrays and structs.
All other comparison operators apply only to integer, floating-point
and string values. The result of a comparison is defined as follows:
Rob Pike's avatar
Rob Pike committed
2885
</p>
2886

2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923
<ul>
	<li>
	Integer values are compared in the usual way.
	</li>
	<li>
	Floating point values are compared as defined by the IEEE-754
	standard.
	</li>
	<li>
	Two complex values <code>u</code>, <code>v</code> are
	equal if both <code>real(u) == real(v)</code> and
	<code>imag(u) == imag(v)</code>.
	</li>
	<li>
	String values are compared byte-wise (lexically).
	</li>
	<li>
	Boolean values are are equal if they are either both
	<code>true</code> or both <code>false</code>.
	</li>
	<li>
	Pointer values are equal if they point to the same location
	or if both are <code>nil</code>.
	</li>
	<li>
	Function values are equal if they refer to the same function
	or if both are <code>nil</code>.
	</li>
	<li>
	A slice value may only be compared to <code>nil</code>.
	</li>
	<li>
	Channel and map values are equal if they were created by the same call to <code>make</code>
<a href="#Making_slices_maps_and_channels">Making slices, maps, and channels</a>)
	or if both are <code>nil</code>.
	</li>
	<li>
2924
	Interface values are equal if they have <a href="#Type_identity">identical</a> dynamic types and
2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940
	equal dynamic values or if both are <code>nil</code>.
	</li>
	<li>
	An interface value <code>x</code> is equal to a non-interface value
	<code>y</code> if the dynamic type of <code>x</code> is identical to
	the static type of <code>y</code> and the dynamic value of <code>x</code>
	is equal to <code>y</code>.
	</li>
	<li>
	A pointer, function, slice, channel, map, or interface value is equal
	to <code>nil</code> if it has been assigned the explicit value
	<code>nil</code>, if it is uninitialized, or if it has been assigned
	another value equal to <code>nil</code>.
	</li>
</ul>

2941

2942
<h3 id="Logical_operators">Logical operators</h3>
2943

Rob Pike's avatar
Rob Pike committed
2944
<p>
2945 2946
Logical operators apply to <a href="#Boolean_types">boolean</a> values
and yield a result of the same type as the operands.
2947
The right operand is evaluated conditionally.
Rob Pike's avatar
Rob Pike committed
2948
</p>
2949

Rob Pike's avatar
Rob Pike committed
2950
<pre class="grammar">
2951 2952 2953 2954
&amp;&amp;    conditional and    p &amp;&amp; q  is  "if p then q else false"
||    conditional or     p || q  is  "if p then true else q"
!     not                !p      is  "not p"
</pre>
2955 2956


2957
<h3 id="Address_operators">Address operators</h3>
2958

Rob Pike's avatar
Rob Pike committed
2959
<p>
Rob Pike's avatar
Rob Pike committed
2960 2961
The address-of operator <code>&amp;</code> generates the address of its operand,
which must be <i>addressable</i>,
2962 2963 2964 2965
that is, either a variable, pointer indirection, or slice indexing
operation;
or a field selector of an addressable struct operand;
or an array indexing operation of an addressable array.
Rob Pike's avatar
Rob Pike committed
2966 2967
Given an operand of pointer type, the pointer indirection
operator <code>*</code> retrieves the value pointed
Rob Pike's avatar
Rob Pike committed
2968 2969 2970 2971 2972 2973 2974 2975 2976 2977
to by the operand.
</p>

<pre>
&amp;x
&amp;a[f(2)]
*p
*pf(x)
</pre>

Rob Pike's avatar
Rob Pike committed
2978 2979
<h3 id="Communication_operators">Communication operators</h3>

2980
<p>
Rob Pike's avatar
Rob Pike committed
2981
The term <i>channel</i> means "value of <a href="#Channel_types">channel type</a>".
Rob Pike's avatar
Rob Pike committed
2982
</p>
2983
<p>
Rob Pike's avatar
Rob Pike committed
2984 2985
The send operation uses the binary operator "&lt;-", which operates on
a channel and a value (expression):
Rob Pike's avatar
Rob Pike committed
2986
</p>
2987

2988
<pre>
2989
ch &lt;- 3
2990
</pre>
2991

Rob Pike's avatar
Rob Pike committed
2992
<p>
Rob Pike's avatar
Rob Pike committed
2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006
The send operation sends the value on the channel.  Both the channel
and the expression are evaluated before communication begins.
Communication blocks until the send can proceed, at which point the
value is transmitted on the channel.
A send on an unbuffered channel can proceed if a receiver is ready.
A send on a buffered channel can proceed if there is room in the buffer.
</p>
<p>
If the send operation appears in an expression context, the value
of the expression is a boolean and the operation is non-blocking.
The value of the boolean reports true if the communication succeeded,
false if it did not. (The channel and
the expression to be sent are evaluated regardless.)
These two examples are equivalent:
Rob Pike's avatar
Rob Pike committed
3007
</p>
3008

3009
<pre>
3010
ok := ch &lt;- 3
Rob Pike's avatar
Rob Pike committed
3011 3012
if ok { print("sent") } else { print("not sent") }

3013
if ch &lt;- 3 { print("sent") } else { print("not sent") }
3014
</pre>
3015

Rob Pike's avatar
Rob Pike committed
3016
<p>
Rob Pike's avatar
Rob Pike committed
3017 3018 3019 3020
In other words, if the program tests the value of a send operation,
the send is non-blocking and the value of the expression is the
success of the operation.  If the program does not test the value,
the operation blocks until it succeeds.
Rob Pike's avatar
Rob Pike committed
3021 3022
</p>
<p>
Rob Pike's avatar
Rob Pike committed
3023 3024 3025
The receive operation uses the prefix unary operator "&lt;-".
The value of the expression is the value received, whose type
is the element type of the channel.
Rob Pike's avatar
Rob Pike committed
3026
</p>
3027

3028
<pre>
3029
&lt;-ch
3030
</pre>
3031

Rob Pike's avatar
Rob Pike committed
3032
<p>
Rob Pike's avatar
Rob Pike committed
3033 3034 3035 3036
The expression blocks until a value is available, which then can
be assigned to a variable or used like any other expression.
If the receive expression does not save the value, the value is
discarded.
Rob Pike's avatar
Rob Pike committed
3037
</p>
3038

3039
<pre>
3040 3041 3042 3043
v1 := &lt;-ch
v2 = &lt;-ch
f(&lt;-ch)
&lt;-strobe  // wait until clock pulse
3044
</pre>
3045

Rob Pike's avatar
Rob Pike committed
3046
<p>
Rob Pike's avatar
Rob Pike committed
3047
If a receive expression is used in an assignment or initialization of the form
Rob Pike's avatar
Rob Pike committed
3048
</p>
3049

3050
<pre>
3051 3052 3053
x, ok = &lt;-ch
x, ok := &lt;-ch
var x, ok = &lt;-ch
3054
</pre>
3055

Rob Pike's avatar
Rob Pike committed
3056
<p>
Rob Pike's avatar
Rob Pike committed
3057 3058 3059 3060 3061 3062 3063
the receive operation becomes non-blocking.
If the operation can proceed, the boolean variable
<code>ok</code> will be set to <code>true</code>
and the value stored in <code>x</code>; otherwise
<code>ok</code> is set
to <code>false</code> and <code>x</code> is set to the
zero value for its type (§<a href="#The_zero_value">The zero value</a>).
Rob Pike's avatar
Rob Pike committed
3064
</p>
3065

3066 3067 3068 3069 3070 3071
<p>
Except in a communications clause of a <a href="#Select_statements">select statement</a>,
sending or receiving from a <code>nil</code> channel causes a
<a href="#Run_time_panics">run-time panic</a>.
</p>

3072
<!---
Rob Pike's avatar
Rob Pike committed
3073
<p>
Robert Griesemer's avatar
Robert Griesemer committed
3074 3075
<span class="alert">TODO: Probably in a separate section, communication semantics
need to be presented regarding send, receive, select, and goroutines.</span>
Rob Pike's avatar
Rob Pike committed
3076
</p>
3077
--->
Rob Pike's avatar
Rob Pike committed
3078 3079 3080

<h3 id="Method_expressions">Method expressions</h3>

3081
<p>
Rob Pike's avatar
Rob Pike committed
3082 3083 3084 3085
If <code>M</code> is in the method set of type <code>T</code>,
<code>T.M</code> is a function that is callable as a regular function
with the same arguments as <code>M</code> prefixed by an additional
argument that is the receiver of the method.
Rob Pike's avatar
Rob Pike committed
3086
</p>
3087

3088
<pre class="ebnf">
Rob Pike's avatar
Rob Pike committed
3089 3090
MethodExpr    = ReceiverType "." MethodName .
ReceiverType  = TypeName | "(" "*" TypeName ")" .
3091
</pre>
3092

Rob Pike's avatar
Rob Pike committed
3093
<p>
Rob Pike's avatar
Rob Pike committed
3094 3095 3096
Consider a struct type <code>T</code> with two methods,
<code>Mv</code>, whose receiver is of type <code>T</code>, and
<code>Mp</code>, whose receiver is of type <code>*T</code>.
Rob Pike's avatar
Rob Pike committed
3097
</p>
3098

3099
<pre>
Rob Pike's avatar
Rob Pike committed
3100
type T struct {
3101
	a int
3102
}
Rob Pike's avatar
Rob Pike committed
3103 3104
func (tv  T) Mv(a int)   int   { return 0 }  // value receiver
func (tp *T) Mp(f float) float { return 1 }  // pointer receiver
3105
var t T
3106
</pre>
3107

Rob Pike's avatar
Rob Pike committed
3108
<p>
Rob Pike's avatar
Rob Pike committed
3109
The expression
Rob Pike's avatar
Rob Pike committed
3110
</p>
3111

Rob Pike's avatar
Rob Pike committed
3112 3113 3114
<pre>
T.Mv
</pre>
3115

3116
<p>
Rob Pike's avatar
Rob Pike committed
3117 3118
yields a function equivalent to <code>Mv</code> but
with an explicit receiver as its first argument; it has signature
Rob Pike's avatar
Rob Pike committed
3119
</p>
3120

3121
<pre>
Russ Cox's avatar
Russ Cox committed
3122
func(tv T, a int) int
3123
</pre>
3124

Rob Pike's avatar
Rob Pike committed
3125
<p>
Rob Pike's avatar
Rob Pike committed
3126 3127
That function may be called normally with an explicit receiver, so
these three invocations are equivalent:
Rob Pike's avatar
Rob Pike committed
3128
</p>
3129

3130
<pre>
Rob Pike's avatar
Rob Pike committed
3131 3132 3133
t.Mv(7)
T.Mv(t, 7)
f := T.Mv; f(t, 7)
3134
</pre>
3135

Rob Pike's avatar
Rob Pike committed
3136
<p>
Rob Pike's avatar
Rob Pike committed
3137
Similarly, the expression
Rob Pike's avatar
Rob Pike committed
3138
</p>
Rob Pike's avatar
Rob Pike committed
3139 3140 3141 3142 3143

<pre>
(*T).Mp
</pre>

3144
<p>
Rob Pike's avatar
Rob Pike committed
3145
yields a function value representing <code>Mp</code> with signature
Rob Pike's avatar
Rob Pike committed
3146
</p>
3147

3148
<pre>
Russ Cox's avatar
Russ Cox committed
3149
func(tp *T, f float) float
3150
</pre>
3151

Rob Pike's avatar
Rob Pike committed
3152
<p>
Rob Pike's avatar
Rob Pike committed
3153 3154
For a method with a value receiver, one can derive a function
with an explicit pointer receiver, so
Rob Pike's avatar
Rob Pike committed
3155
</p>
3156

3157
<pre>
Rob Pike's avatar
Rob Pike committed
3158
(*T).Mv
3159
</pre>
3160

Rob Pike's avatar
Rob Pike committed
3161
<p>
Rob Pike's avatar
Rob Pike committed
3162
yields a function value representing <code>Mv</code> with signature
Rob Pike's avatar
Rob Pike committed
3163
</p>
3164

3165
<pre>
Russ Cox's avatar
Russ Cox committed
3166
func(tv *T, a int) int
3167
</pre>
3168

Rob Pike's avatar
Rob Pike committed
3169
<p>
Rob Pike's avatar
Rob Pike committed
3170 3171 3172 3173
Such a function indirects through the receiver to create a value
to pass as the receiver to the underlying method;
the method does not overwrite the value whose address is passed in
the function call.
Rob Pike's avatar
Rob Pike committed
3174
</p>
3175

Rob Pike's avatar
Rob Pike committed
3176
<p>
Rob Pike's avatar
Rob Pike committed
3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187
The final case, a value-receiver function for a pointer-receiver method,
is illegal because pointer-receiver methods are not in the method set
of the value type.
</p>

<p>
Function values derived from methods are called with function call syntax;
the receiver is provided as the first argument to the call.
That is, given <code>f := T.Mv</code>, <code>f</code> is invoked
as <code>f(t, 7)</code> not <code>t.f(7)</code>.
To construct a function that binds the receiver, use a
3188
<a href="#Function_literals">closure</a>.
Rob Pike's avatar
Rob Pike committed
3189 3190 3191 3192 3193
</p>

<p>
It is legal to derive a function value from a method of an interface type.
The resulting function takes an explicit receiver of that interface type.
Rob Pike's avatar
Rob Pike committed
3194
</p>
3195

3196 3197 3198 3199 3200 3201 3202 3203 3204
<h3 id="Conversions">Conversions</h3>

<p>
Conversions are expressions of the form <code>T(x)</code>
where <code>T</code> is a type and <code>x</code> is an expression
that can be converted to type <code>T</code>.
</p>

<pre class="ebnf">
3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216
Conversion = Type "(" Expression ")" .
</pre>

<p>
If the type starts with an operator it must be parenthesized:
</p>

<pre>
*Point(p)        // same as *(Point(p))
(*Point)(p)      // p is converted to (*Point)
&lt;-chan int(c)    // same as &lt;-(chan int(c))
(&lt;-chan int)(c)  // c is converted to (&lt;-chan int)
3217 3218 3219
</pre>

<p>
3220 3221
A value <code>x</code> can be converted to type <code>T</code> in any
of these cases:
3222
</p>
3223

3224 3225
<ul>
	<li>
3226
	<code>x</code> is <a href="#Assignability">assignable</a>
3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252
	to <code>T</code>.
	</li>
	<li>
	<code>x</code>'s type and <code>T</code> have identical
	<a href="#Types">underlying types</a>.
	</li>
	<li>
	<code>x</code>'s type and <code>T</code> are unnamed pointer types
	and their pointer base types have identical underlying types.
	</li>
	<li>
	<code>x</code>'s type and <code>T</code> are both integer or floating
	point types.
	</li>
	<li>
	<code>x</code>'s type and <code>T</code> are both complex types.
	</li>
	<li>
	<code>x</code> is an integer or has type <code>[]byte</code> or
	<code>[]int</code> and <code>T</code> is a string type.
	</li>
	<li>
	<code>x</code> is a string and <code>T</code> is <code>[]byte</code> or
	<code>[]int</code>.
	</li>
</ul>
3253 3254

<p>
3255 3256 3257 3258 3259 3260
Specific rules apply to conversions between numeric types or to and from
a string type.
These conversions may change the representation of <code>x</code>
and incur a run-time cost.
All other conversions only change the type but not the representation
of <code>x</code>.
3261 3262
</p>

3263
<h4>Conversions between numeric types</h4>
3264
<ol>
3265
<li>
3266 3267 3268 3269 3270
When converting between integer types, if the value is a signed integer, it is
sign extended to implicit infinite precision; otherwise it is zero extended.
It is then truncated to fit in the result type's size.
For example, if <code>v := uint16(0x10F0)</code>, then <code>uint32(int8(v)) == 0xFFFFFFF0</code>.
The conversion always yields a valid value; there is no indication of overflow.
3271 3272
</li>
<li>
3273 3274
When converting a floating-point number to an integer, the fraction is discarded
(truncation towards zero).
3275
</li>
Rob Pike's avatar
Rob Pike committed
3276
<li>
3277 3278
When converting an integer or floating-point number to a floating-point type,
or a complex number to another complex type, the result value is rounded
Rob Pike's avatar
Rob Pike committed
3279
to the precision specified by the destination type.
3280 3281 3282 3283
For instance, the value of a variable <code>x</code> of type <code>float32</code>
may be stored using additional precision beyond that of an IEEE-754 32-bit number,
but float32(x) represents the result of rounding <code>x</code>'s value to
32-bit precision. Similarly, <code>x + 0.1</code> may use more than 32 bits
Evan Shaw's avatar
Evan Shaw committed
3284
of precision, but <code>float32(x + 0.1)</code> does not.
3285
</li>
3286 3287 3288
</ol>

<p>
Rob Pike's avatar
Rob Pike committed
3289 3290 3291
In all conversions involving floating-point or complex values,
if the result type cannot represent the value the conversion
succeeds but the result value is
3292 3293 3294
implementation-dependent.
</p>

3295 3296
<h4>Conversions to and from a string type</h4>

3297
<ol>
3298
<li>
3299
Converting a signed or unsigned integer value to a string type yields a
3300 3301
string containing the UTF-8 representation of the integer. Values outside
the range of valid Unicode code points are converted to <code>"\uFFFD"</code>.
3302 3303

<pre>
3304 3305 3306
string('a')           // "a"
string(-1)            // "\ufffd" == "\xef\xbf\xbd "
string(0xf8)          // "\u00f8" == "ø" == "\xc3\xb8"
3307
type MyString string
3308
MyString(0x65e5)      // "\u65e5" == "日" == "\xe6\x97\xa5"
3309 3310 3311 3312 3313 3314 3315 3316
</pre>
</li>

<li>
Converting a value of type <code>[]byte</code> (or
the equivalent <code>[]uint8</code>) to a string type yields a
string whose successive bytes are the elements of the slice.  If
the slice value is <code>nil</code>, the result is the empty string.
3317 3318

<pre>
3319
string([]byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'})  // "hellø"
3320 3321
</pre>
</li>
3322

3323
<li>
3324 3325 3326 3327
Converting a value of type <code>[]int</code> to a string type yields
a string that is the concatenation of the individual integers
converted to strings.  If the slice value is <code>nil</code>, the
result is the empty string.
3328
<pre>
3329 3330
string([]int{0x767d, 0x9d6c, 0x7fd4})  // "\u767d\u9d6c\u7fd4" == "白鵬翔"
</pre>
3331 3332 3333
</li>

<li>
3334 3335 3336 3337 3338 3339 3340 3341
Converting a value of a string type to <code>[]byte</code> (or <code>[]uint8</code>)
yields a slice whose successive elements are the bytes of the string.
If the string is empty, the result is <code>[]byte(nil)</code>.

<pre>
[]byte("hellø")  // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
</pre>
</li>
3342

3343 3344 3345 3346
<li>
Converting a value of a string type to <code>[]int</code> yields a
slice containing the individual Unicode code points of the string.
If the string is empty, the result is <code>[]int(nil)</code>.
3347
<pre>
3348
[]int(MyString("白鵬翔"))  // []int{0x767d, 0x9d6c, 0x7fd4}
3349 3350
</pre>
</li>
3351
</ol>
3352 3353 3354 3355 3356 3357 3358 3359

<p>
There is no linguistic mechanism to convert between pointers and integers.
The package <a href="#Package_unsafe"><code>unsafe</code></a>
implements this functionality under
restricted circumstances.
</p>

3360
<h3 id="Constant_expressions">Constant expressions</h3>
Robert Griesemer's avatar
Robert Griesemer committed
3361

3362
<p>
3363 3364
Constant expressions may contain only <a href="#Constants">constant</a>
operands and are evaluated at compile-time.
3365
</p>
Robert Griesemer's avatar
Robert Griesemer committed
3366

3367
<p>
3368 3369 3370 3371 3372 3373
Untyped boolean, numeric, and string constants may be used as operands
wherever it is legal to use an operand of boolean, numeric, or string type,
respectively. Except for shift operations, if the operands of a binary operation
are an untyped integer constant and an untyped floating-point constant,
the integer constant is converted to an untyped floating-point constant
(relevant for <code>/</code> and <code>%</code>).
Rob Pike's avatar
Rob Pike committed
3374 3375 3376 3377 3378
Similarly,
untyped integer or floating-point constants may be used as operands
wherever it is legal to use an operand of complex type;
the integer or floating point constant is converted to a
complex constant with a zero imaginary part.
3379
</p>
3380 3381

<p>
3382
Applying an operator to untyped constants results in an untyped
Rob Pike's avatar
Rob Pike committed
3383 3384 3385
constant of the same kind (that is, a boolean, integer, floating-point,
complex, or string constant), except for
<a href="#Comparison_operators">comparison operators</a>, which result in
3386
a constant of type <code>bool</code>.
3387 3388
</p>

Rob Pike's avatar
Rob Pike committed
3389 3390 3391 3392 3393 3394 3395
<p>
Imaginary literals are untyped complex constants (with zero real part)
and may be combined in binary
operations with untyped integer and floating-point constants; the
result is an untyped complex constant.
Complex constants are always constructed from
constant expressions involving imaginary
3396 3397
literals or constants derived from them, or calls of the built-in function
<a href="#Complex_numbers"><code>cmplx</code></a>.
Rob Pike's avatar
Rob Pike committed
3398 3399 3400 3401
</p>

<pre>
const Σ = 1 - 0.707i
3402
const Δ = Σ + 2.0e-4 - 1/1i
Rob Pike's avatar
Rob Pike committed
3403 3404 3405 3406
const Φ = iota * 1i
const iΓ = cmplx(0, Γ)
</pre>

3407
<p>
3408 3409 3410
Constant expressions are always evaluated exactly; intermediate values and the
constants themselves may require precision significantly larger than supported
by any predeclared type in the language. The following are legal declarations:
3411 3412 3413
</p>

<pre>
3414 3415
const Huge = 1 &lt;&lt; 100
const Four int8 = Huge &gt;&gt; 98
3416
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
3417

3418
<p>
3419 3420
The values of <i>typed</i> constants must always be accurately representable as values
of the constant type. The following constant expressions are illegal:
3421 3422 3423
</p>

<pre>
Robert Griesemer's avatar
Robert Griesemer committed
3424 3425 3426 3427 3428
uint(-1)       // -1 cannot be represented as a uint
int(3.14)      // 3.14 cannot be represented as an int
int64(Huge)    // 1&lt;&lt;100 cannot be represented as an int64
Four * 300     // 300 cannot be represented as an int8
Four * 100     // 400 cannot be represented as an int8
3429 3430 3431
</pre>

<p>
3432
The mask used by the unary bitwise complement operator <code>^</code> matches
Rob Pike's avatar
Rob Pike committed
3433
the rule for non-constants: the mask is all 1s for unsigned constants
3434
and -1 for signed and untyped constants.
3435 3436 3437
</p>

<pre>
3438
^1          // untyped integer constant, equal to -2
3439 3440 3441
uint8(^1)   // error, same as uint8(-2), out of range
^uint8(1)   // typed uint8 constant, same as 0xFF ^ uint8(1) = uint8(0xFE)
int8(^1)    // same as int8(-2)
Russ Cox's avatar
Russ Cox committed
3442
^int8(1)    // same as -1 ^ int8(1) = -2
3443 3444
</pre>

3445
<!---
3446
<p>
Robert Griesemer's avatar
Robert Griesemer committed
3447
<span class="alert">
3448 3449 3450
TODO: perhaps ^ should be disallowed on non-uints instead of assuming twos complement.
Also it may be possible to make typed constants more like variables, at the cost of fewer
overflow etc. errors being caught.
Robert Griesemer's avatar
Robert Griesemer committed
3451
</span>
3452
</p>
3453
--->
3454

3455
<h3 id="Order_of_evaluation">Order of evaluation</h3>
3456 3457 3458 3459 3460

<p>
When evaluating the elements of an assignment or expression,
all function calls, method calls and
communication operations are evaluated in lexical left-to-right
3461 3462 3463
order.
</p>

3464
<p>
3465
For example, in the assignment
3466 3467
</p>
<pre>
3468
y[f()], ok = g(h(), i() + x[j()], &lt;-c), k()
3469 3470
</pre>
<p>
3471 3472
the function calls and communication happen in the order
<code>f()</code>, <code>h()</code>, <code>i()</code>, <code>j()</code>,
3473
<code>&lt;-c</code>, <code>g()</code>, and <code>k()</code>.
3474 3475 3476
However, the order of those events compared to the evaluation
and indexing of <code>x</code> and the evaluation
of <code>y</code> is not specified.
3477 3478
</p>

3479 3480 3481 3482 3483 3484 3485 3486
<p>
Floating-point operations within a single expression are evaluated according to
the associativity of the operators.  Explicit parentheses affect the evaluation
by overriding the default associativity.
In the expression <code>x + (y + z)</code> the addition <code>y + z</code>
is performed before adding <code>x</code>.
</p>

3487
<h2 id="Statements">Statements</h2>
3488

Rob Pike's avatar
Rob Pike committed
3489
<p>
3490
Statements control execution.
Rob Pike's avatar
Rob Pike committed
3491
</p>
3492

3493
<pre class="ebnf">
3494
Statement =
3495 3496
	Declaration | LabeledStmt | SimpleStmt |
	GoStmt | ReturnStmt | BreakStmt | ContinueStmt | GotoStmt |
3497 3498
	FallthroughStmt | Block | IfStmt | SwitchStmt | SelectStmt | ForStmt |
	DeferStmt .
Robert Griesemer's avatar
Robert Griesemer committed
3499

3500
SimpleStmt = EmptyStmt | ExpressionStmt | IncDecStmt | Assignment | ShortVarDecl .
3501
</pre>
3502

3503

3504
<h3 id="Empty_statements">Empty statements</h3>
3505

Rob Pike's avatar
Rob Pike committed
3506
<p>
3507
The empty statement does nothing.
Rob Pike's avatar
Rob Pike committed
3508
</p>
3509

3510
<pre class="ebnf">
3511
EmptyStmt = .
3512
</pre>
3513 3514


3515
<h3 id="Labeled_statements">Labeled statements</h3>
3516 3517 3518 3519 3520 3521

<p>
A labeled statement may be the target of a <code>goto</code>,
<code>break</code> or <code>continue</code> statement.
</p>

3522
<pre class="ebnf">
3523
LabeledStmt = Label ":" Statement .
3524 3525 3526 3527
Label       = identifier .
</pre>

<pre>
3528
Error: log.Crash("error encountered")
3529 3530 3531
</pre>


3532
<h3 id="Expression_statements">Expression statements</h3>
3533

Rob Pike's avatar
Rob Pike committed
3534 3535 3536 3537 3538 3539
<p>
Function calls, method calls, and channel operations
can appear in statement context.
</p>


3540
<pre class="ebnf">
3541
ExpressionStmt = Expression .
3542
</pre>
3543

3544 3545
<pre>
f(x+y)
3546
&lt;-ch
3547
</pre>
3548 3549


3550
<h3 id="IncDec_statements">IncDec statements</h3>
3551

Rob Pike's avatar
Rob Pike committed
3552
<p>
3553
The "++" and "--" statements increment or decrement their operands
3554 3555 3556
by the untyped <a href="#Constants">constant</a> <code>1</code>.
As with an assignment, the operand must be a variable, pointer indirection,
field selector or index expression.
Rob Pike's avatar
Rob Pike committed
3557
</p>
3558

3559
<pre class="ebnf">
3560
IncDecStmt = Expression ( "++" | "--" ) .
3561
</pre>
3562

Rob Pike's avatar
Rob Pike committed
3563
<p>
Robert Griesemer's avatar
Robert Griesemer committed
3564
The following <a href="#Assignments">assignment statements</a> are semantically
3565
equivalent:
Rob Pike's avatar
Rob Pike committed
3566
</p>
3567

Rob Pike's avatar
Rob Pike committed
3568
<pre class="grammar">
3569 3570 3571 3572
IncDec statement    Assignment
x++                 x += 1
x--                 x -= 1
</pre>
3573

3574
<h3 id="Assignments">Assignments</h3>
3575

3576
<pre class="ebnf">
3577
Assignment = ExpressionList assign_op ExpressionList .
Rob Pike's avatar
Rob Pike committed
3578

3579 3580
assign_op = [ add_op | mul_op ] "=" .
</pre>
3581

Rob Pike's avatar
Rob Pike committed
3582
<p>
Rob Pike's avatar
Rob Pike committed
3583
Each left-hand side operand must be <a href="#Address_operators">addressable</a>,
3584
a map index expression,
Rob Pike's avatar
Rob Pike committed
3585
or the <a href="#Blank_identifier">blank identifier</a>.
Rob Pike's avatar
Rob Pike committed
3586
</p>
3587

3588 3589 3590 3591
<pre>
x = 1
*p = f()
a[i] = 23
3592
k = &lt;-ch
3593
</pre>
3594

Rob Pike's avatar
Rob Pike committed
3595 3596 3597 3598
<p>
An <i>assignment operation</i> <code>x</code> <i>op</i><code>=</code>
<code>y</code> where <i>op</i> is a binary arithmetic operation is equivalent
to <code>x</code> <code>=</code> <code>x</code> <i>op</i>
3599
<code>y</code> but evaluates <code>x</code>
Rob Pike's avatar
Rob Pike committed
3600
only once.  The <i>op</i><code>=</code> construct is a single token.
Rob Pike's avatar
Rob Pike committed
3601 3602
In assignment operations, both the left- and right-hand expression lists
must contain exactly one single-valued expression.
Rob Pike's avatar
Rob Pike committed
3603
</p>
3604

3605
<pre>
Robert Griesemer's avatar
Robert Griesemer committed
3606
a[i] &lt;&lt;= 2
Rob Pike's avatar
Rob Pike committed
3607
i &amp;^= 1&lt;&lt;n
3608
</pre>
3609

Rob Pike's avatar
Rob Pike committed
3610 3611 3612 3613
<p>
A tuple assignment assigns the individual elements of a multi-valued
operation to a list of variables.  There are two forms.  In the
first, the right hand operand is a single multi-valued expression
Robert Griesemer's avatar
Robert Griesemer committed
3614 3615
such as a function evaluation or <a href="#Channel_types">channel</a> or
<a href="#Map_types">map</a> operation or a <a href="#Type_assertions">type assertion</a>.
3616
The number of operands on the left
Robert Griesemer's avatar
Robert Griesemer committed
3617
hand side must match the number of values.  For instance, if
Rob Pike's avatar
Rob Pike committed
3618 3619
<code>f</code> is a function returning two values,
</p>
3620

3621 3622 3623
<pre>
x, y = f()
</pre>
3624

Rob Pike's avatar
Rob Pike committed
3625 3626
<p>
assigns the first value to <code>x</code> and the second to <code>y</code>.
Rob Pike's avatar
Rob Pike committed
3627
The <a href="#Blank_identifier">blank identifier</a> provides a
Robert Griesemer's avatar
Robert Griesemer committed
3628
way to ignore values returned by a multi-valued expression:
Rob Pike's avatar
Rob Pike committed
3629
</p>
3630

Robert Griesemer's avatar
Robert Griesemer committed
3631 3632 3633 3634
<pre>
x, _ = f()  // ignore second value returned by f()
</pre>

Rob Pike's avatar
Rob Pike committed
3635 3636
<p>
In the second form, the number of operands on the left must equal the number
3637 3638 3639
of expressions on the right, each of which must be single-valued, and the
<i>n</i>th expression on the right is assigned to the <i>n</i>th
operand on the left.
3640 3641
The expressions on the right are evaluated before assigning to
any of the operands on the left, but otherwise the evaluation
Rob Pike's avatar
Rob Pike committed
3642
order is unspecified beyond <a href="#Order_of_evaluation">the usual rules</a>.
Rob Pike's avatar
Rob Pike committed
3643
</p>
3644

3645
<pre>
Rob Pike's avatar
Rob Pike committed
3646
a, b = b, a  // exchange a and b
3647
</pre>
Rob Pike's avatar
Rob Pike committed
3648 3649

<p>
3650
In assignments, each value must be
3651
<a href="#Assignability">assignable</a> to the type of the
3652 3653
operand to which it is assigned. If an untyped <a href="#Constants">constant</a>
is assigned to a variable of interface type, the constant is <a href="#Conversions">converted</a>
Rob Pike's avatar
Rob Pike committed
3654 3655
to type <code>bool</code>, <code>int</code>, <code>float</code>,
<code>complex</code> or <code>string</code>
3656
respectively, depending on whether the value is a boolean, integer, floating-point,
Rob Pike's avatar
Rob Pike committed
3657
complex, or string constant.
Rob Pike's avatar
Rob Pike committed
3658
</p>
3659 3660


3661
<h3 id="If_statements">If statements</h3>
3662

Rob Pike's avatar
Rob Pike committed
3663 3664 3665 3666 3667 3668 3669
<p>
"If" statements specify the conditional execution of two branches
according to the value of a boolean expression.  If the expression
evaluates to true, the "if" branch is executed, otherwise, if
present, the "else" branch is executed.  A missing condition
is equivalent to <code>true</code>.
</p>
3670

3671
<pre class="ebnf">
3672
IfStmt    = "if" [ SimpleStmt ";" ] [ Expression ] Block [ "else" Statement ] .
3673
</pre>
3674

3675 3676 3677 3678 3679
<pre>
if x > 0 {
	return true;
}
</pre>
3680

3681
<p>
Russ Cox's avatar
Russ Cox committed
3682 3683
The expression may be preceded by a simple statement, which
executes before the expression is evaluated.
3684
</p>
3685

3686
<pre>
3687 3688
if x := f(); x &lt; y {
	return x
3689
} else if x > z {
3690
	return z
3691
} else {
3692
	return y
3693 3694
}
</pre>
3695 3696


3697
<h3 id="Switch_statements">Switch statements</h3>
3698

Rob Pike's avatar
Rob Pike committed
3699 3700
<p>
"Switch" statements provide multi-way execution.
Rob Pike's avatar
Rob Pike committed
3701 3702 3703
An expression or type specifier is compared to the "cases"
inside the "switch" to determine which branch
to execute.
Rob Pike's avatar
Rob Pike committed
3704
</p>
3705

3706
<pre class="ebnf">
3707
SwitchStmt = ExprSwitchStmt | TypeSwitchStmt .
3708 3709
</pre>

Rob Pike's avatar
Rob Pike committed
3710
<p>
Rob Pike's avatar
Rob Pike committed
3711 3712 3713 3714 3715 3716 3717
There are two forms: expression switches and type switches.
In an expression switch, the cases contain expressions that are compared
against the value of the switch expression.
In a type switch, the cases contain types that are compared against the
type of a specially annotated switch expression.
</p>

3718
<h4 id="Expression_switches">Expression switches</h4>
Rob Pike's avatar
Rob Pike committed
3719 3720 3721 3722 3723

<p>
In an expression switch,
the switch expression is evaluated and
the case expressions, which need not be constants,
3724
are evaluated left-to-right and top-to-bottom; the first one that equals the
Rob Pike's avatar
Rob Pike committed
3725
switch expression
Rob Pike's avatar
Rob Pike committed
3726 3727
triggers execution of the statements of the associated case;
the other cases are skipped.
Rob Pike's avatar
Rob Pike committed
3728 3729
If no case matches and there is a "default" case,
its statements are executed.
Rob Pike's avatar
Rob Pike committed
3730 3731
There can be at most one default case and it may appear anywhere in the
"switch" statement.
Robert Griesemer's avatar
Robert Griesemer committed
3732
A missing switch expression is equivalent to
3733
the expression <code>true</code>.
Rob Pike's avatar
Rob Pike committed
3734
</p>
3735

3736
<pre class="ebnf">
3737
ExprSwitchStmt = "switch" [ SimpleStmt ";" ] [ Expression ] "{" { ExprCaseClause } "}" .
3738
ExprCaseClause = ExprSwitchCase ":" { Statement ";" } .
3739
ExprSwitchCase = "case" ExpressionList | "default" .
3740 3741
</pre>

Rob Pike's avatar
Rob Pike committed
3742 3743 3744
<p>
In a case or default clause,
the last statement only may be a "fallthrough" statement
3745
<a href="#Fallthrough_statements">Fallthrough statement</a>) to
Rob Pike's avatar
Rob Pike committed
3746
indicate that control should flow from the end of this clause to
3747
the first statement of the next clause.
Rob Pike's avatar
Rob Pike committed
3748 3749
Otherwise control flows to the end of the "switch" statement.
</p>
Robert Griesemer's avatar
Robert Griesemer committed
3750

3751
<p>
Russ Cox's avatar
Russ Cox committed
3752 3753
The expression may be preceded by a simple statement, which
executes before the expression is evaluated.
Rob Pike's avatar
Rob Pike committed
3754
</p>
3755

3756 3757
<pre>
switch tag {
3758 3759 3760
default: s3()
case 0, 1, 2, 3: s1()
case 4, 5, 6, 7: s2()
3761
}
3762

3763
switch x := f(); {  // missing switch expression means "true"
3764 3765
case x &lt; 0: return -x
default: return x
3766
}
3767

Robert Griesemer's avatar
Robert Griesemer committed
3768
switch {
3769 3770 3771
case x &lt; y: f1()
case x &lt; z: f2()
case x == 4: f3()
3772 3773
}
</pre>
3774

3775
<h4 id="Type_switches">Type switches</h4>
Rob Pike's avatar
Rob Pike committed
3776 3777

<p>
3778
A type switch compares types rather than values. It is otherwise similar
Robert Griesemer's avatar
tweaks  
Robert Griesemer committed
3779
to an expression switch. It is marked by a special switch expression that
3780
has the form of a <a href="#Type_assertions">type assertion</a>
3781 3782
using the reserved word <code>type</code> rather than an actual type.
Cases then match literal types against the dynamic type of the expression
3783
in the type assertion.
Rob Pike's avatar
Rob Pike committed
3784 3785
</p>

3786
<pre class="ebnf">
3787
TypeSwitchStmt  = "switch" [ SimpleStmt ";" ] TypeSwitchGuard "{" { TypeCaseClause } "}" .
3788
TypeSwitchGuard = [ identifier ":=" ] PrimaryExpr "." "(" "type" ")" .
3789
TypeCaseClause  = TypeSwitchCase ":" { Statement ";" } .
Rob Pike's avatar
Rob Pike committed
3790 3791
TypeSwitchCase  = "case" TypeList | "default" .
TypeList        = Type { "," Type } .
Rob Pike's avatar
Rob Pike committed
3792 3793
</pre>

3794
<p>
3795 3796 3797 3798 3799 3800
The TypeSwitchGuard may include a
<a href="#Short_variable_declarations">short variable declaration</a>.
When that form is used, the variable is declared in each clause.
In clauses with a case listing exactly one type, the variable
has that type; otherwise, the variable has the type of the expression
in the TypeSwitchGuard.
3801 3802
</p>

Rob Pike's avatar
Rob Pike committed
3803
<p>
3804 3805 3806
The type in a case may be <code>nil</code>
<a href="#Predeclared_identifiers">Predeclared identifiers</a>);
that case is used when the expression in the TypeSwitchGuard
Robert Griesemer's avatar
tweaks  
Robert Griesemer committed
3807
is a <code>nil</code> interface value.
3808 3809 3810
</p>

<p>
Robert Griesemer's avatar
Robert Griesemer committed
3811
Given an expression <code>x</code> of type <code>interface{}</code>,
3812
the following type switch:
Rob Pike's avatar
Rob Pike committed
3813 3814 3815
</p>

<pre>
Robert Griesemer's avatar
Robert Griesemer committed
3816
switch i := x.(type) {
3817
case nil:
3818
	printString("x is nil")
Rob Pike's avatar
Rob Pike committed
3819
case int:
3820
	printInt(i)  // i is an int
Rob Pike's avatar
Rob Pike committed
3821
case float:
3822
	printFloat(i)  // i is a float
3823
case func(int) float:
3824
	printFunction(i)  // i is a function
3825
case bool, string:
3826
	printString("type is bool or string")  // i is an interface{}
Rob Pike's avatar
Rob Pike committed
3827
default:
3828
	printString("don't know the type")
Rob Pike's avatar
Rob Pike committed
3829
}
3830
</pre>
Rob Pike's avatar
Rob Pike committed
3831

3832 3833 3834 3835 3836
<p>
could be rewritten:
</p>

<pre>
3837
v := x  // x is evaluated exactly once
3838
if v == nil {
3839
	printString("x is nil")
3840
} else if i, is_int := v.(int); is_int {
3841
	printInt(i)  // i is an int
3842
} else if i, is_float := v.(float); is_float {
3843
	printFloat(i)  // i is a float
3844
} else if i, is_func := v.(func(int) float); is_func {
3845
	printFunction(i)  // i is a function
3846
} else {
3847 3848
	i1, is_bool := v.(bool)
	i2, is_string := v.(string)
3849
	if is_bool || is_string {
3850 3851
		i := v
		printString("type is bool or string")  // i is an interface{}
3852
	} else {
3853 3854
		i := v
		printString("don't know the type")  // i is an interface{}
3855
	}
Rob Pike's avatar
Rob Pike committed
3856 3857
}
</pre>
3858

3859
<p>
Russ Cox's avatar
Russ Cox committed
3860 3861
The type switch guard may be preceded by a simple statement, which
executes before the guard is evaluated.
Robert Griesemer's avatar
tweaks  
Robert Griesemer committed
3862
</p>
3863 3864 3865

<p>
The "fallthrough" statement is not permitted in a type switch.
Russ Cox's avatar
Russ Cox committed
3866 3867
</p>

3868
<h3 id="For_statements">For statements</h3>
3869

Rob Pike's avatar
Rob Pike committed
3870 3871 3872 3873
<p>
A "for" statement specifies repeated execution of a block. The iteration is
controlled by a condition, a "for" clause, or a "range" clause.
</p>
3874

3875
<pre class="ebnf">
3876
ForStmt = "for" [ Condition | ForClause | RangeClause ] Block .
3877 3878
Condition = Expression .
</pre>
3879

Rob Pike's avatar
Rob Pike committed
3880 3881 3882 3883 3884 3885
<p>
In its simplest form, a "for" statement specifies the repeated execution of
a block as long as a boolean condition evaluates to true.
The condition is evaluated before each iteration.
If the condition is absent, it is equivalent to <code>true</code>.
</p>
3886

3887 3888 3889 3890 3891
<pre>
for a &lt; b {
	a *= 2
}
</pre>
3892

Rob Pike's avatar
Rob Pike committed
3893
<p>
Rob Pike's avatar
Rob Pike committed
3894
A "for" statement with a ForClause is also controlled by its condition, but
Rob Pike's avatar
Rob Pike committed
3895 3896
additionally it may specify an <i>init</i>
and a <i>post</i> statement, such as an assignment,
Russ Cox's avatar
Russ Cox committed
3897
an increment or decrement statement. The init statement may be a
Robert Griesemer's avatar
Robert Griesemer committed
3898
<a href="#Short_variable_declarations">short variable declaration</a>, but the post statement must not.
Rob Pike's avatar
Rob Pike committed
3899
</p>
3900

3901
<pre class="ebnf">
3902
ForClause = [ InitStmt ] ";" [ Condition ] ";" [ PostStmt ] .
3903 3904
InitStmt = SimpleStmt .
PostStmt = SimpleStmt .
3905
</pre>
3906

3907
<pre>
3908
for i := 0; i &lt; 10; i++ {
3909 3910 3911
	f(i)
}
</pre>
3912

3913
<p>
Rob Pike's avatar
Rob Pike committed
3914 3915 3916 3917
If non-empty, the init statement is executed once before evaluating the
condition for the first iteration;
the post statement is executed after each execution of the block (and
only if the block was executed).
3918 3919
Any element of the ForClause may be empty but the
<a href="#Semicolons">semicolons</a> are
Rob Pike's avatar
Rob Pike committed
3920 3921 3922
required unless there is only a condition.
If the condition is absent, it is equivalent to <code>true</code>.
</p>
Robert Griesemer's avatar
Robert Griesemer committed
3923

3924
<pre>
Rob Pike's avatar
Rob Pike committed
3925 3926
for cond { S() }    is the same as    for ; cond ; { S() }
for      { S() }    is the same as    for true     { S() }
3927
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
3928

Rob Pike's avatar
Rob Pike committed
3929 3930
<p>
A "for" statement with a "range" clause
Rob Pike's avatar
Rob Pike committed
3931 3932
iterates through all entries of an array, slice, string or map,
or values received on a channel.
Robert Griesemer's avatar
Robert Griesemer committed
3933 3934
For each entry it first assigns the current index or key to an iteration
variable - or the current (index, element) or (key, value) pair to a pair
Rob Pike's avatar
Rob Pike committed
3935 3936
of iteration variables - and then executes the block.
</p>
Robert Griesemer's avatar
Robert Griesemer committed
3937

3938
<pre class="ebnf">
3939
RangeClause = ExpressionList ( "=" | ":=" ) "range" Expression .
3940
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
3941

Rob Pike's avatar
Rob Pike committed
3942
<p>
Rob Pike's avatar
Rob Pike committed
3943
The type of the right-hand expression in the "range" clause must be an
Rob Pike's avatar
Rob Pike committed
3944
array, slice, string or map, or a pointer to an array;
3945
or it may be a channel.
Rob Pike's avatar
Rob Pike committed
3946
Except for channels,
3947 3948 3949 3950
the identifier list must contain one or two expressions
(as in assignments, these must be a
variable, pointer indirection, field selector, or index expression)
denoting the
Rob Pike's avatar
Rob Pike committed
3951
iteration variables. On each iteration,
Rob Pike's avatar
Rob Pike committed
3952
the first variable is set to the string, array or slice index or
Robert Griesemer's avatar
Robert Griesemer committed
3953
map key, and the second variable, if present, is set to the corresponding
Rob Pike's avatar
Rob Pike committed
3954
string or array element or map value.
Rob Pike's avatar
Rob Pike committed
3955 3956
The types of the array or slice index (always <code>int</code>)
and element, or of the map key and value respectively,
3957
must be <a href="#Assignability">assignable</a> to
3958 3959 3960 3961 3962 3963
the type of the iteration variables.  The expression on the right hand
side is evaluated once before beginning the loop.  At each iteration
of the loop, the values produced by the range clause are assigned to
the left hand side as in an <a href="#Assignments">assignment
statement</a>.  Function calls on the left hand side will be evaluated
exactly once per iteration.
Rob Pike's avatar
Rob Pike committed
3964
</p>
3965
<p>
3966
For a value of a string type, the "range" clause iterates over the Unicode code points
Rob Pike's avatar
Rob Pike committed
3967
in the string.  On successive iterations, the index variable will be the
Rob Pike's avatar
Rob Pike committed
3968
index of the first byte of successive UTF-8-encoded code points in the string, and
Rob Pike's avatar
Rob Pike committed
3969 3970 3971 3972 3973 3974 3975
the second variable, of type <code>int</code>, will be the value of
the corresponding code point.  If the iteration encounters an invalid
UTF-8 sequence, the second variable will be <code>0xFFFD</code>,
the Unicode replacement character, and the next iteration will advance
a single byte in the string.
</p>
<p>
3976
For channels, the identifier list must contain one identifier.
Robert Griesemer's avatar
Robert Griesemer committed
3977
The iteration receives values sent on the channel until the channel is closed;
3978 3979 3980
it does not process the zero value sent before the channel is closed.
</p>
<p>
Rob Pike's avatar
Rob Pike committed
3981
The iteration variables may be declared by the "range" clause (":="), in which
3982
case their scope ends at the end of the "for" statement (§<a href="#Declarations_and">Declarations and</a>
Rob Pike's avatar
Rob Pike committed
3983
scope rules). In this case their types are set to
3984
<code>int</code> and the array element type, or the map key and value types, respectively.
Rob Pike's avatar
Rob Pike committed
3985 3986 3987
If the iteration variables are declared outside the "for" statement,
after execution their values will be those of the last iteration.
</p>
Robert Griesemer's avatar
Robert Griesemer committed
3988

3989
<pre>
3990 3991
var a [10]string
m := map[string]int{"mon":0, "tue":1, "wed":2, "thu":3, "fri":4, "sat":5, "sun":6}
3992 3993 3994 3995 3996 3997 3998 3999

for i, s := range a {
	// type of i is int
	// type of s is string
	// s == a[i]
	g(i, s)
}

4000
var key string
4001
var val interface {}  // value type of m is assignable to val
Rob Pike's avatar
Rob Pike committed
4002 4003
for key, val = range m {
	h(key, val)
4004 4005 4006 4007
}
// key == last map key encountered in iteration
// val == map[key]
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
4008

Rob Pike's avatar
Rob Pike committed
4009
<p>
Robert Griesemer's avatar
Robert Griesemer committed
4010 4011
If map entries that have not yet been processed are deleted during iteration,
they will not be processed. If map entries are inserted during iteration, the
4012
behavior is implementation-dependent, but each entry will be processed at most once.
Rob Pike's avatar
Rob Pike committed
4013
</p>
4014

4015
<h3 id="Go_statements">Go statements</h3>
4016

Rob Pike's avatar
Rob Pike committed
4017
<p>
4018
A "go" statement starts the execution of a function or method call
Rob Pike's avatar
Rob Pike committed
4019 4020 4021
as an independent concurrent thread of control, or <i>goroutine</i>,
within the same address space.
</p>
4022

4023
<pre class="ebnf">
4024
GoStmt = "go" Expression .
4025
</pre>
4026

Rob Pike's avatar
Rob Pike committed
4027 4028 4029
<p>
The expression must be a call, and
unlike with a regular call, program execution does not wait
4030
for the invoked function to complete.
Rob Pike's avatar
Rob Pike committed
4031
</p>
4032

4033 4034
<pre>
go Server()
4035
go func(ch chan&lt;- bool) { for { sleep(10); ch &lt;- true; }} (c)
4036
</pre>
4037 4038


4039
<h3 id="Select_statements">Select statements</h3>
4040

Rob Pike's avatar
Rob Pike committed
4041 4042 4043
<p>
A "select" statement chooses which of a set of possible communications
will proceed.  It looks similar to a "switch" statement but with the
4044
cases all referring to communication operations.
Rob Pike's avatar
Rob Pike committed
4045
</p>
4046

4047
<pre class="ebnf">
4048
SelectStmt = "select" "{" { CommClause } "}" .
4049
CommClause = CommCase ":" { Statement ";" } .
4050 4051 4052 4053
CommCase = "case" ( SendExpr | RecvExpr) | "default" .
SendExpr =  Expression "&lt;-" Expression .
RecvExpr =  [ Expression ( "=" | ":=" ) ] "&lt;-" Expression .
</pre>
4054

4055
<p>
Rob Pike's avatar
Rob Pike committed
4056
For all the send and receive expressions in the "select"
4057 4058
statement, the channel expressions are evaluated in top-to-bottom order, along with
any expressions that appear on the right hand side of send expressions.
4059
A channel may be <code>nil</code>,
Rob Pike's avatar
Rob Pike committed
4060 4061 4062
which is equivalent to that case not
being present in the select statement
except, if a send, its expression is still evaluated.
4063 4064 4065 4066 4067 4068 4069 4070 4071 4072
If any of the resulting operations can proceed, one of those is
chosen and the corresponding communication and statements are
evaluated.  Otherwise, if there is a default case, that executes;
if there is no default case, the statement blocks until one of the communications can
complete.
If there are no cases with non-<code>nil</code> channels,
the statement blocks forever.
Even if the statement blocks,
the channel and send expressions are evaluated only once,
upon entering the select statement.
Rob Pike's avatar
Rob Pike committed
4073
</p>
4074
<p>
Rob Pike's avatar
Rob Pike committed
4075 4076
Since all the channels and send expressions are evaluated, any side
effects in that evaluation will occur for all the communications
Rob Pike's avatar
Rob Pike committed
4077 4078
in the "select" statement.
</p>
4079
<p>
4080
If multiple cases can proceed, a pseudo-random fair choice is made to decide
4081
which single communication will execute.
4082
<p>
Robert Griesemer's avatar
Robert Griesemer committed
4083 4084
The receive case may declare a new variable using a
<a href="#Short_variable_declarations">short variable declaration</a>.
Rob Pike's avatar
Rob Pike committed
4085
</p>
4086

4087
<pre>
4088 4089
var c, c1, c2 chan int
var i1, i2 int
4090 4091
select {
case i1 = &lt;-c1:
4092
	print("received ", i1, " from c1\n")
4093
case c2 &lt;- i2:
4094
	print("sent ", i2, " to c2\n")
4095
default:
4096
	print("no communication\n")
4097 4098 4099
}

for {  // send random sequence of bits to c
4100
	select {
4101 4102
	case c &lt;- 0:  // note: no statement, no fallthrough, no folding of cases
	case c &lt;- 1:
4103
	}
4104
}
4105 4106

select { }  // block forever
4107
</pre>
4108 4109


4110
<h3 id="Return_statements">Return statements</h3>
4111

Rob Pike's avatar
Rob Pike committed
4112 4113
<p>
A "return" statement terminates execution of the containing function
4114
and optionally provides a result value or values to the caller.
Rob Pike's avatar
Rob Pike committed
4115
</p>
4116

4117
<pre class="ebnf">
4118
ReturnStmt = "return" [ ExpressionList ] .
4119
</pre>
4120

4121 4122 4123 4124
<p>
In a function without a result type, a "return" statement must not
specify any result values.
</p>
Rob Pike's avatar
Rob Pike committed
4125
<pre>
4126
func no_result() {
Rob Pike's avatar
Rob Pike committed
4127 4128 4129
	return
}
</pre>
4130

Rob Pike's avatar
Rob Pike committed
4131
<p>
4132 4133
There are three ways to return values from a function with a result
type:
Rob Pike's avatar
Rob Pike committed
4134
</p>
4135

4136 4137 4138
<ol>
	<li>The return value or values may be explicitly listed
		in the "return" statement. Each expression must be single-valued
4139 4140
		and <a href="#Assignability">assignable</a>
		to the corresponding element of the function's result type.
4141 4142
<pre>
func simple_f() int {
Rob Pike's avatar
Rob Pike committed
4143 4144 4145 4146 4147
	return 2
}

func complex_f1() (re float, im float) {
	return -7.0, -4.0
4148 4149
}
</pre>
4150 4151 4152 4153 4154 4155 4156
	</li>
	<li>The expression list in the "return" statement may be a single
		call to a multi-valued function. The effect is as if each value
		returned from that function were assigned to a temporary
		variable with the type of the respective value, followed by a
		"return" statement listing these variables, at which point the
		rules of the previous case apply.
4157
<pre>
Rob Pike's avatar
Rob Pike committed
4158 4159
func complex_f2() (re float, im float) {
	return complex_f1()
4160 4161
}
</pre>
4162 4163
	</li>
	<li>The expression list may be empty if the functions's result
4164
		type specifies names for its result parameters (§<a href="#Function_Types">Function Types</a>).
4165
		The result parameters act as ordinary local variables
4166 4167
		and the function may assign values to them as necessary.
		The "return" statement returns the values of these variables.
4168
<pre>
Rob Pike's avatar
Rob Pike committed
4169
func complex_f3() (re float, im float) {
4170 4171 4172
	re = 7.0
	im = 4.0
	return
4173 4174
}
</pre>
4175 4176
	</li>
</ol>
4177

4178 4179 4180 4181
<p>
Regardless of how they are declared, all the result values are initialized to the zero values for their type (§<a href="#The_zero_value">The zero value</a>) upon entry to the function.
</p>

4182
<!---
4183
<p>
Robert Griesemer's avatar
Robert Griesemer committed
4184
<span class="alert">
4185 4186 4187
TODO: Define when return is required.<br />
TODO: Language about result parameters needs to go into a section on
      function/method invocation<br />
Robert Griesemer's avatar
Robert Griesemer committed
4188
</span>
4189
</p>
4190
--->
4191

4192
<h3 id="Break_statements">Break statements</h3>
4193

Rob Pike's avatar
Rob Pike committed
4194 4195 4196 4197
<p>
A "break" statement terminates execution of the innermost
"for", "switch" or "select" statement.
</p>
4198

4199
<pre class="ebnf">
4200
BreakStmt = "break" [ Label ] .
4201
</pre>
4202

Rob Pike's avatar
Rob Pike committed
4203 4204 4205 4206
<p>
If there is a label, it must be that of an enclosing
"for", "switch" or "select" statement, and that is the one whose execution
terminates
4207
<a href="#For_statements">For statements</a>, §<a href="#Switch_statements">Switch statements</a>, §<a href="#Select_statements">Select statements</a>).
Rob Pike's avatar
Rob Pike committed
4208
</p>
4209

4210
<pre>
4211
L: for i &lt; n {
4212
	switch i {
Rob Pike's avatar
Rob Pike committed
4213
		case 5: break L
4214
	}
4215 4216
}
</pre>
4217

4218
<h3 id="Continue_statements">Continue statements</h3>
4219

Rob Pike's avatar
Rob Pike committed
4220 4221
<p>
A "continue" statement begins the next iteration of the
Rob Pike's avatar
Rob Pike committed
4222
innermost "for" loop at its post statement (§<a href="#For_statements">For statements</a>).
Rob Pike's avatar
Rob Pike committed
4223
</p>
4224

4225
<pre class="ebnf">
4226
ContinueStmt = "continue" [ Label ] .
4227
</pre>
4228

Rob Pike's avatar
Rob Pike committed
4229
<p>
4230 4231 4232 4233
If there is a label, it must be that of an enclosing
"for" statement, and that is the one whose execution
advances
<a href="#For_statements">For statements</a>).
Rob Pike's avatar
Rob Pike committed
4234
</p>
4235

4236
<h3 id="Goto_statements">Goto statements</h3>
4237

Rob Pike's avatar
Rob Pike committed
4238 4239 4240
<p>
A "goto" statement transfers control to the statement with the corresponding label.
</p>
4241

4242
<pre class="ebnf">
4243
GotoStmt = "goto" Label .
4244
</pre>
4245

4246 4247 4248
<pre>
goto Error
</pre>
4249

Rob Pike's avatar
Rob Pike committed
4250 4251
<p>
Executing the "goto" statement must not cause any variables to come into
4252 4253
scope that were not already in scope at the point of the goto.  For
instance, this example:
Rob Pike's avatar
Rob Pike committed
4254
</p>
4255

4256
<pre>
4257 4258
goto L  // BAD
v := 3
4259 4260
L:
</pre>
4261

Rob Pike's avatar
Rob Pike committed
4262 4263 4264
<p>
is erroneous because the jump to label <code>L</code> skips
the creation of <code>v</code>.
4265
<!---
Robert Griesemer's avatar
Robert Griesemer committed
4266
(<span class="alert">TODO: Eliminate in favor of used and not set errors?</span>)
4267
--->
Rob Pike's avatar
Rob Pike committed
4268
</p>
4269

4270
<h3 id="Fallthrough_statements">Fallthrough statements</h3>
4271

Rob Pike's avatar
Rob Pike committed
4272 4273
<p>
A "fallthrough" statement transfers control to the first statement of the
4274
next case clause in a expression "switch" statement (§<a href="#Expression_switches">Expression switches</a>). It may
4275 4276
be used only as the final non-empty statement in a case or default clause in an
expression "switch" statement.
Rob Pike's avatar
Rob Pike committed
4277
</p>
4278

4279
<pre class="ebnf">
4280
FallthroughStmt = "fallthrough" .
4281
</pre>
4282 4283


4284
<h3 id="Defer_statements">Defer statements</h3>
Robert Griesemer's avatar
Robert Griesemer committed
4285

Rob Pike's avatar
Rob Pike committed
4286 4287 4288 4289
<p>
A "defer" statement invokes a function whose execution is deferred to the moment
the surrounding function returns.
</p>
Robert Griesemer's avatar
Robert Griesemer committed
4290

4291
<pre class="ebnf">
4292
DeferStmt = "defer" Expression .
4293
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
4294

Rob Pike's avatar
Rob Pike committed
4295 4296 4297
<p>
The expression must be a function or method call.
Each time the "defer" statement
4298
executes, the parameters to the function call are evaluated and saved anew but the
Rob Pike's avatar
Rob Pike committed
4299 4300 4301
function is not invoked.
Deferred function calls are executed in LIFO order
immediately before the surrounding function returns,
4302 4303
after the return values, if any, have been evaluated, but before they
are returned to the caller. For instance, if the deferred function is
Rob Pike's avatar
Rob Pike committed
4304
a <a href="#Function_literals">function literal</a> and the surrounding
4305 4306 4307
function has <a href="#Function_types">named result parameters</a> that
are in scope within the literal, the deferred function may access and modify
the result parameters before they are returned.
Rob Pike's avatar
Rob Pike committed
4308
</p>
Robert Griesemer's avatar
Robert Griesemer committed
4309

4310
<pre>
4311 4312
lock(l)
defer unlock(l)  // unlocking happens before surrounding function returns
Robert Griesemer's avatar
Robert Griesemer committed
4313

4314 4315
// prints 3 2 1 0 before surrounding function returns
for i := 0; i &lt;= 3; i++ {
4316
	defer fmt.Print(i)
4317
}
4318 4319 4320 4321 4322 4323 4324 4325

// f returns 1
func f() (result int) {
	defer func() {
		result++
	}()
	return 0
}
4326
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
4327

4328
<h2 id="Built-in_functions">Built-in functions</h2>
4329 4330

<p>
Rob Pike's avatar
Rob Pike committed
4331
Built-in functions are
4332 4333 4334 4335
<a href="#Predeclared_identifiers">predeclared</a>.
They are called like any other function but some of them
accept a type instead of an expression as the first argument.
</p>
Robert Griesemer's avatar
Robert Griesemer committed
4336

4337 4338 4339 4340 4341 4342
<p>
The built-in functions do not have standard Go types,
so they can only appear in <a href="#Calls">call expressions</a>;
they cannot be used as function values.
</p>

4343 4344 4345
<pre class="ebnf">
BuiltinCall = identifier "(" [ BuiltinArgs ] ")" .
BuiltinArgs = Type [ "," ExpressionList ] | ExpressionList .
4346
</pre>
4347

4348
<h3 id="Close_and_closed">Close and closed</h3>
4349

Rob Pike's avatar
Rob Pike committed
4350
<p>
4351 4352 4353 4354
For a channel <code>c</code>, the built-in function <code>close(c)</code>
marks the channel as unable to accept more values through a send operation;
values sent to a closed channed are ignored.
After calling <code>close</code>, and after any previously
4355
sent values have been received, receive operations will return
4356 4357
the zero value for the channel's type without blocking.
After at least one such zero value has been
4358
received, <code>closed(c)</code> returns true.
Rob Pike's avatar
Rob Pike committed
4359
</p>
4360

4361

4362
<h3 id="Length_and_capacity">Length and capacity</h3>
4363

Rob Pike's avatar
Rob Pike committed
4364
<p>
4365 4366 4367
The built-in functions <code>len</code> and <code>cap</code> take arguments
of various types and return a result of type <code>int</code>.
The implementation guarantees that the result always fits into an <code>int</code>.
4368 4369
</p>

4370 4371
<pre class="grammar">
Call      Argument type        Result
4372

4373
len(s)    string type          string length in bytes
4374
          [n]T, *[n]T          array length (== n)
4375 4376 4377
          []T                  slice length
          map[K]T              map length (number of defined keys)
          chan T               number of elements queued in channel buffer
4378

4379
cap(s)    [n]T, *[n]T          array length (== n)
4380 4381
          []T                  slice capacity
          chan T               channel buffer capacity
4382
</pre>
4383

4384 4385 4386 4387 4388
<p>
The capacity of a slice is the number of elements for which there is
space allocated in the underlying array.
At any time the following relationship holds:
</p>
4389

4390
<pre>
4391
0 <= len(s) <= cap(s)
4392
</pre>
4393

4394 4395 4396 4397
<p>
The length and capacity of a <code>nil</code> slice, map, or channel are 0.
</p>

4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411
<p>
The expression
<code>len(s)</code> is a
<a href="#Constants">constant</a> if <code>s</code> is a string constant.
The expressions
<code>len(s)</code> and
<code>cap(s)</code> are
constants if <code>s</code> is an (optionally parenthesized)
identifier or
<a href="#Qualified_identifiers">qualified identifier</a> 
denoting an array or pointer to array.
Otherwise invocations of <code>len</code> and <code>cap</code> are not
constant.
</p>
4412

4413
<h3 id="Allocation">Allocation</h3>
4414

Rob Pike's avatar
Rob Pike committed
4415 4416 4417
<p>
The built-in function <code>new</code> takes a type <code>T</code> and
returns a value of type <code>*T</code>.
4418
The memory is initialized as described in the section on initial values
4419
<a href="#The_zero_value">The zero value</a>).
Rob Pike's avatar
Rob Pike committed
4420
</p>
4421

4422
<pre class="grammar">
4423 4424
new(T)
</pre>
4425

Rob Pike's avatar
Rob Pike committed
4426
<p>
4427
For instance
Rob Pike's avatar
Rob Pike committed
4428
</p>
4429

4430 4431 4432 4433
<pre>
type S struct { a int; b float }
new(S)
</pre>
4434

4435
<p>
Rob Pike's avatar
Rob Pike committed
4436 4437 4438 4439 4440
dynamically allocates memory for a variable of type <code>S</code>,
initializes it (<code>a=0</code>, <code>b=0.0</code>),
and returns a value of type <code>*S</code> containing the address
of the memory.
</p>
Robert Griesemer's avatar
Robert Griesemer committed
4441

4442
<h3 id="Making_slices_maps_and_channels">Making slices, maps and channels</h3>
Robert Griesemer's avatar
Robert Griesemer committed
4443

Rob Pike's avatar
Rob Pike committed
4444 4445 4446 4447 4448 4449 4450
<p>
Slices, maps and channels are reference types that do not require the
extra indirection of an allocation with <code>new</code>.
The built-in function <code>make</code> takes a type <code>T</code>,
which must be a slice, map or channel type,
optionally followed by a type-specific list of expressions.
It returns a value of type <code>T</code> (not <code>*T</code>).
Robert Griesemer's avatar
Robert Griesemer committed
4451
The memory is initialized as described in the section on initial values
4452
<a href="#The_zero_value">The zero value</a>).
Rob Pike's avatar
Rob Pike committed
4453
</p>
Robert Griesemer's avatar
Robert Griesemer committed
4454

4455
<pre class="grammar">
4456
Call             Type T     Result
Robert Griesemer's avatar
Robert Griesemer committed
4457

4458 4459
make(T, n)       slice      slice of type T with length n and capacity n
make(T, n, m)    slice      slice of type T with length n and capacity m
Robert Griesemer's avatar
Robert Griesemer committed
4460

4461 4462 4463 4464 4465
make(T)          map        map of type T
make(T, n)       map        map of type T with initial space for n elements

make(T)          channel    synchronous channel of type T
make(T, n)       channel    asynchronous channel of type T, buffer size n
4466
</pre>
Robert Griesemer's avatar
Robert Griesemer committed
4467 4468


Rob Pike's avatar
Rob Pike committed
4469
<p>
4470 4471 4472 4473
The arguments <code>n</code> and <code>m</code> must be of integer type.
A <a href="#Run_time_panics">run-time panic</a> occurs if <code>n</code>
is negative or larger than <code>m</code>, or if <code>n</code> or
<code>m</code> cannot be represented by an <code>int</code>.
Rob Pike's avatar
Rob Pike committed
4474
</p>
Robert Griesemer's avatar
Robert Griesemer committed
4475

4476
<pre>
4477 4478 4479 4480
s := make([]int, 10, 100)        // slice with len(s) == 10, cap(s) == 100
s := make([]int, 10)             // slice with len(s) == cap(s) == 10
c := make(chan int, 10)          // channel with a buffer size of 10
m := make(map[string] int, 100)  // map with initial space for 100 elements
4481
</pre>
4482

4483

4484 4485 4486
<h3 id="Copying_slices">Copying slices</h3>

<p>
4487
The built-in function <code>copy</code> copies slice elements from
4488 4489
a source <code>src</code> to a destination <code>dst</code> and returns the
number of elements copied. Source and destination may overlap.
4490
Both arguments must have <a href="#Type_identity">identical</a> element type <code>T</code> and must be
4491
<a href="#Assignability">assignable</a> to a slice
4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504
of type <code>[]T</code>. The number of arguments copied is the minimum of
<code>len(src)</code> and <code>len(dst)</code>.
</p>

<pre class="grammar">
copy(dst, src []T) int
</pre>

<p>
Examples:
</p>

<pre>
4505 4506
var a = [...]int{0, 1, 2, 3, 4, 5, 6, 7}
var s = make([]int, 6)
4507
n1 := copy(s, a[0:])  // n1 == 6, s == []int{0, 1, 2, 3, 4, 5}
4508
n2 := copy(s, s[2:])  // n2 == 4, s == []int{2, 3, 4, 5, 4, 5}
4509 4510
</pre>

Rob Pike's avatar
Rob Pike committed
4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553
<h3 id="Complex_numbers">Assembling and disassembling complex numbers</h3>

<p>
Three functions assemble and disassemble complex numbers.
The built-in function <code>cmplx</code> constructs a complex
value from a floating-point real and imaginary part, while
<code>real</code> and <code>imag</code>
extract the real and imaginary parts of a complex value.
</p>

<pre class="grammar">
cmplx(realPart, imaginaryPart floatT) complexT
real(complexT) floatT
imag(complexT) floatT
</pre>

<p>
The type of the arguments and return value correspond.
For <code>cmplx</code>, the two arguments must be of the same
floating-point type and the return type is the complex type
with the corresponding floating-point constituents:
<code>complex</code> for <code>float</code>,
<code>complex64</code> for <code>float32</code>,
<code>complex128</code> for <code>float64</code>.
The <code>real</code> and <code>imag</code> functions
together form the inverse, so for a complex value <code>z</code>,
<code>z</code> <code>==</code> <code>cmplx(real(z),</code> <code>imag(z))</code>.
</p>

<p>
If the operands of these functions are all constants, the return
value is a constant.
</p>

<pre>
var a = cmplx(2, -2)  // has type complex
var b = cmplx(1.0, -1.4)  // has type complex
x := float32(math.Cos(math.Pi/2))
var c64 = cmplx(5, -x)  // has type complex64
var im = imag(b)  // has type float
var rl = real(c64)  // type float32
</pre>

Rob Pike's avatar
Rob Pike committed
4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566
<h3 id="Handling_panics">Handling panics</h3>

<p> Two built-in functions, <code>panic</code> and <code>recover</code>,
assist in reporting and handling <a href="#Run_time_panics">run-time panics</a>
and program-defined error conditions. 
</p>

<pre class="grammar">
func panic(interface{})
func recover() interface{}
</pre>

<p>
4567
<span class="alert">TODO: Most of this text could move to the respective
Rob Pike's avatar
Rob Pike committed
4568 4569
comments in <code>runtime.go</code> once the functions are implemented.
They are here, at least for now, for reference and discussion.
4570
</span>
Rob Pike's avatar
Rob Pike committed
4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606
</p>

<p>
When a function <code>F</code> calls <code>panic</code>, normal
execution of <code>F</code> stops immediately.  Any functions whose
execution was <a href="#Defer_statements">deferred</a> by the
invocation of <code>F</code> are run in the usual way, and then
<code>F</code> returns to its caller.  To the caller, <code>F</code>
then behaves like a call to <code>panic</code>, terminating its own
execution and running deferred functions.  This continues until all
functions in the goroutine have ceased execution, in reverse order.
At that point, the program is
terminated and the error condition is reported, including the value of
the argument to <code>panic</code>.  This termination sequence is
called <i>panicking</i>.
</p>

<p>
The <code>recover</code> function allows a program to manage behavior
of a panicking goroutine.  Executing a <code>recover</code> call
inside a deferred function (but not any function called by it) stops
the panicking sequence by restoring normal execution, and retrieves
the error value passed to the call of <code>panic</code>.  If
<code>recover</code> is called outside the deferred function it will
not stop a panicking sequence.  In this case, and when the goroutine
is not panicking, <code>recover</code> returns <code>nil</code>.
</p>

<p>
If the function defined here,
</p>

<pre>
func f(hideErrors bool) {
	defer func() {
		if x := recover(); x != nil {
4607
			println("panicking with value", x)
Rob Pike's avatar
Rob Pike committed
4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663
			if !hideErrors {
				panic(x)  // go back to panicking
			}
		}
		println("function returns normally") // executes only when hideErrors==true
	}()
	println("before")
	p()
	println("after")	// never executes
}

func p() {
	panic(3)
}
</pre>

<p>
is called with <code>hideErrors=true</code>, it prints
</p>

<pre>
before
panicking with value 3
function returns normally
</pre>

<p>
and resumes normal execution in the function that called <code>f</code>. Otherwise, it prints
</p>

<pre>
before
panicking with value 3
</pre>

<p>
and, absent further <code>recover</code> calls, terminates the program.
</p>

<p>
Since deferred functions run before assigning the return values to the caller
of the deferring function, a deferred invocation of a function literal may modify the
invoking function's return values in the event of a panic. This permits a function to protect its
caller from panics that occur in functions it calls.
</p>

<pre>
func IsPrintable(s string) (ok bool) {
	ok = true
	defer func() {
		if recover() != nil {
			println("input is not printable")
			ok = false
		}
		// Panicking has stopped; execution will resume normally in caller.
		// The return value will be true normally, false if a panic occurred.
Stephen Ma's avatar
Stephen Ma committed
4664
	}()
Rob Pike's avatar
Rob Pike committed
4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697
	panicIfNotPrintable(s)	// will panic if validations fails.
}
</pre>

<!---
<p>
A deferred function that calls <code>recover</code> will see the
argument passed to <code>panic</code>.  However, functions called
<i>from</i> the deferred function run normally, without behaving as
though they are panicking.  This allows deferred code to run normally
in case recovery is necessary and guarantees that functions that manage
their own panics will not fail incorrectly.  The function
</p>

<pre>
func g() {
	s := ReadString()
	defer func() {
		if IsPrintable(s) {
			println("finished processing", s)
		} else {
			println("finished processing unprintable string")
		}
	}()
	Analyze(s)
}
</pre>

<p>
will not cause <code>IsPrintable</code> to print <code>"input is not printable"</code>
due to a <code>panic</code> triggered by the call to <code>Analyze</code>.
</p>
-->
4698

4699 4700
<h3 id="Bootstrapping">Bootstrapping</h3>

4701
<p>
4702 4703 4704
Current implementations provide several built-in functions useful during
bootstrapping. These functions are documented for completeness but are not
guaranteed to stay in the language. They do not return a result.
4705 4706
</p>

4707
<pre class="grammar">
4708
Function   Behavior
4709 4710 4711 4712 4713 4714

print      prints all arguments; formatting of arguments is implementation-specific
println    like print but prints spaces between arguments and a newline at the end
</pre>


4715
<h2 id="Packages">Packages</h2>
4716

Rob Pike's avatar
Rob Pike committed
4717 4718
<p>
Go programs are constructed by linking together <i>packages</i>.
4719 4720 4721 4722 4723
A package in turn is constructed from one or more source files
that together declare constants, types, variables and functions
belonging to the package and which are accessible in all files
of the same package. Those elements may be
<a href="#Exported_identifiers">exported</a> and used in another package.
Rob Pike's avatar
Rob Pike committed
4724 4725
</p>

4726
<h3 id="Source_file_organization">Source file organization</h3>
Rob Pike's avatar
Rob Pike committed
4727 4728 4729 4730 4731 4732

<p>
Each source file consists of a package clause defining the package
to which it belongs, followed by a possibly empty set of import
declarations that declare packages whose contents it wishes to use,
followed by a possibly empty set of declarations of functions,
Robert Griesemer's avatar
Robert Griesemer committed
4733
types, variables, and constants.
Rob Pike's avatar
Rob Pike committed
4734
</p>
4735

4736
<pre class="ebnf">
4737
SourceFile       = PackageClause ";" { ImportDecl ";" } { TopLevelDecl ";" } .
4738
</pre>
4739

4740
<h3 id="Package_clause">Package clause</h3>
Rob Pike's avatar
Rob Pike committed
4741

4742
<p>
Rob Pike's avatar
Rob Pike committed
4743 4744 4745
A package clause begins each source file and defines the package
to which the file belongs.
</p>
4746

4747
<pre class="ebnf">
Robert Griesemer's avatar
Robert Griesemer committed
4748 4749
PackageClause  = "package" PackageName .
PackageName    = identifier .
Rob Pike's avatar
Rob Pike committed
4750
</pre>
4751

Robert Griesemer's avatar
Robert Griesemer committed
4752 4753 4754 4755
<p>
The PackageName must not be the <a href="#Blank_identifier">blank identifier</a>.
</p>

Rob Pike's avatar
Rob Pike committed
4756 4757
<pre>
package math
4758
</pre>
4759

Rob Pike's avatar
Rob Pike committed
4760 4761 4762 4763
<p>
A set of files sharing the same PackageName form the implementation of a package.
An implementation may require that all source files for a package inhabit the same directory.
</p>
4764

4765
<h3 id="Import_declarations">Import declarations</h3>
Rob Pike's avatar
Rob Pike committed
4766 4767

<p>
Rob Pike's avatar
Rob Pike committed
4768 4769 4770 4771 4772 4773
An import declaration states that the source file containing the
declaration uses identifiers
<a href="#Exported_identifiers">exported</a> by the <i>imported</i>
package and enables access to them.  The import names an
identifier (PackageName) to be used for access and an ImportPath
that specifies the package to be imported.
Rob Pike's avatar
Rob Pike committed
4774
</p>
4775

4776
<pre class="ebnf">
4777
ImportDecl       = "import" ( ImportSpec | "(" { ImportSpec ";" } ")" ) .
4778
ImportSpec       = [ "." | PackageName ] ImportPath .
4779
ImportPath       = string_lit .
4780
</pre>
4781

4782
<p>
Rob Pike's avatar
Rob Pike committed
4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796
The PackageName is used in <a href="#Qualified_identifiers">qualified identifiers</a>
to access the exported identifiers of the package within the importing source file.
It is declared in the <a href="#Blocks">file block</a>.
If the PackageName is omitted, it defaults to the identifier specified in the
<a href="#Package_clauses">package clause</a> of the imported package.
If an explicit period (<code>.</code>) appears instead of a name, all the
package's exported identifiers will be declared in the current file's
file block and can be accessed without a qualifier.
</p>

<p>
The interpretation of the ImportPath is implementation-dependent but
it is typically a substring of the full file name of the compiled
package and may be relative to a repository of installed packages.
Rob Pike's avatar
Rob Pike committed
4797
</p>
Russ Cox's avatar
Russ Cox committed
4798

4799
<p>
Rob Pike's avatar
Rob Pike committed
4800 4801 4802
Assume we have compiled a package containing the package clause
<code>package math</code>, which exports function <code>Sin</code>, and
installed the compiled package in the file identified by
Rob Pike's avatar
Rob Pike committed
4803
<code>"lib/math"</code>.
Rob Pike's avatar
Rob Pike committed
4804 4805 4806
This table illustrates how <code>Sin</code> may be accessed in files
that import the package after the
various types of import declaration.
Rob Pike's avatar
Rob Pike committed
4807
</p>
4808

Rob Pike's avatar
Rob Pike committed
4809
<pre class="grammar">
4810
Import declaration          Local name of Sin
Rob Pike's avatar
Rob Pike committed
4811 4812

import   "lib/math"         math.Sin
4813
import M "lib/math"         M.Sin
Rob Pike's avatar
Rob Pike committed
4814
import . "lib/math"         Sin
4815
</pre>
4816

4817
<p>
Rob Pike's avatar
Rob Pike committed
4818 4819
An import declaration declares a dependency relation between
the importing and imported package.
4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830
It is illegal for a package to import itself or to import a package without
referring to any of its exported identifiers. To import a package solely for
its side-effects (initialization), use the <a href="#Blank_identifier">blank</a>
identifier as explicit package name:
</p>

<pre>
import _ "lib/math"
</pre>


4831
<h3 id="An_example_package">An example package</h3>
Rob Pike's avatar
Rob Pike committed
4832 4833 4834 4835

<p>
Here is a complete Go package that implements a concurrent prime sieve.
</p>
4836

4837 4838 4839
<pre>
package main

Rob Pike's avatar
Rob Pike committed
4840 4841
import "fmt"

4842
// Send the sequence 2, 3, 4, ... to channel 'ch'.
4843
func generate(ch chan&lt;- int) {
4844
	for i := 2; ; i++ {
4845
		ch &lt;- i  // Send 'i' to channel 'ch'.
4846
	}
4847 4848
}

Fazlul Shahriar's avatar
Fazlul Shahriar committed
4849
// Copy the values from channel 'src' to channel 'dst',
4850
// removing those divisible by 'prime'.
4851 4852 4853
func filter(src &lt;-chan int, dst chan&lt;- int, prime int) {
	for i := range src {	// Loop over values received from 'src'.
		if i%prime != 0 {
4854
			dst &lt;- i  // Send 'i' to channel 'dst'.
4855 4856
		}
	}
4857 4858 4859 4860
}

// The prime sieve: Daisy-chain filter processes together.
func sieve() {
4861 4862
	ch := make(chan int)  // Create a new channel.
	go generate(ch)       // Start generate() as a subprocess.
4863
	for {
4864 4865 4866 4867 4868
		prime := &lt;-ch
		fmt.Print(prime, "\n")
		ch1 := make(chan int)
		go filter(ch, ch1, prime)
		ch = ch1
4869
	}
4870
}
4871

4872
func main() {
4873
	sieve()
4874 4875
}
</pre>
4876

4877
<h2 id="Program_initialization_and_execution">Program initialization and execution</h2>
4878

4879
<h3 id="The_zero_value">The zero value</h3>
Rob Pike's avatar
Rob Pike committed
4880
<p>
4881
When memory is allocated to store a value, either through a declaration
Rob Pike's avatar
Rob Pike committed
4882 4883
or <code>make()</code> or <code>new()</code> call,
and no explicit initialization is provided, the memory is
4884
given a default initialization.  Each element of such a value is
4885
set to the <i>zero value</i> for its type: <code>false</code> for booleans,
Rob Pike's avatar
Rob Pike committed
4886
<code>0</code> for integers, <code>0.0</code> for floats, <code>""</code>
4887
for strings, and <code>nil</code> for pointers, functions, interfaces, slices, channels, and maps.
Rob Pike's avatar
Rob Pike committed
4888
This initialization is done recursively, so for instance each element of an
Rob Pike's avatar
Rob Pike committed
4889 4890
array of structs will have its fields zeroed if no value is specified.
</p>
4891
<p>
4892
These two simple declarations are equivalent:
Rob Pike's avatar
Rob Pike committed
4893
</p>
4894

4895
<pre>
4896 4897
var i int
var i int = 0
4898
</pre>
4899

Rob Pike's avatar
Rob Pike committed
4900
<p>
4901
After
Rob Pike's avatar
Rob Pike committed
4902
</p>
4903

4904
<pre>
4905 4906
type T struct { i int; f float; next *T }
t := new(T)
4907
</pre>
4908

Rob Pike's avatar
Rob Pike committed
4909
<p>
4910
the following holds:
Rob Pike's avatar
Rob Pike committed
4911
</p>
4912

4913 4914 4915 4916 4917
<pre>
t.i == 0
t.f == 0.0
t.next == nil
</pre>
4918

Rob Pike's avatar
Rob Pike committed
4919 4920 4921 4922 4923 4924 4925 4926
<p>
The same would also be true after
</p>

<pre>
var t T
</pre>

4927
<h3 id="Program_execution">Program execution</h3>
Rob Pike's avatar
Rob Pike committed
4928
<p>
4929
A package with no imports is initialized by assigning initial values to
4930
all its package-level variables
Rob Pike's avatar
Rob Pike committed
4931
and then calling any
Rob Pike's avatar
Rob Pike committed
4932 4933 4934 4935 4936 4937
package-level function with the name and signature of
</p>
<pre>
func init()
</pre>
<p>
4938 4939 4940 4941 4942
defined in its source.
A package may contain multiple
<code>init()</code> functions, even
within a single source file; they execute
in unspecified order.
Rob Pike's avatar
Rob Pike committed
4943
</p>
4944
<p>
4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958
Within a package, package-level variables are initialized,
and constant values are determined, in
data-dependent order: if the initializer of <code>A</code>
depends on the value of <code>B</code>, <code>A</code>
will be set after <code>B</code>.
It is an error if such dependencies form a cycle.
Dependency analysis is done lexically: <code>A</code>
depends on <code>B</code> if the value of <code>A</code>
contains a mention of <code>B</code>, contains a value
whose initializer
mentions <code>B</code>, or mentions a function that
mentions <code>B</code>, recursively.
If two items are not interdependent, they will be initialized
in the order they appear in the source.
Rob Pike's avatar
Rob Pike committed
4959 4960
Since the dependency analysis is done per package, it can produce
unspecified results  if <code>A</code>'s initializer calls a function defined
4961 4962 4963
in another package that refers to <code>B</code>.
</p>
<p>
4964
Initialization code may contain "go" statements, but the functions
4965 4966
they invoke do not begin execution until initialization of the entire
program is complete. Therefore, all initialization code is run in a single
Rob Pike's avatar
Rob Pike committed
4967
goroutine.
Rob Pike's avatar
Rob Pike committed
4968
</p>
4969
<p>
Rob Pike's avatar
Rob Pike committed
4970 4971 4972
An <code>init()</code> function cannot be referred to from anywhere
in a program. In particular, <code>init()</code> cannot be called explicitly,
nor can a pointer to <code>init</code> be assigned to a function variable.
Rob Pike's avatar
Rob Pike committed
4973
</p>
4974
<p>
4975
If a package has imports, the imported packages are initialized
4976
before initializing the package itself. If multiple packages import
Rob Pike's avatar
Rob Pike committed
4977
a package <code>P</code>, <code>P</code> will be initialized only once.
Rob Pike's avatar
Rob Pike committed
4978
</p>
4979
<p>
4980 4981
The importing of packages, by construction, guarantees that there can
be no cyclic dependencies in initialization.
Rob Pike's avatar
Rob Pike committed
4982
</p>
4983
<p>
4984
A complete program, possibly created by linking multiple packages,
Rob Pike's avatar
Rob Pike committed
4985
must have one package called <code>main</code>, with a function
Rob Pike's avatar
Rob Pike committed
4986
</p>
4987

4988
<pre>
Rob Pike's avatar
Rob Pike committed
4989
func main() { ... }
4990
</pre>
4991

Rob Pike's avatar
Rob Pike committed
4992
<p>
Rob Pike's avatar
Rob Pike committed
4993 4994
defined.
The function <code>main.main()</code> takes no arguments and returns no value.
Rob Pike's avatar
Rob Pike committed
4995
</p>
4996
<p>
Rob Pike's avatar
Rob Pike committed
4997
Program execution begins by initializing the <code>main</code> package and then
Rob Pike's avatar
Rob Pike committed
4998 4999
invoking <code>main.main()</code>.
</p>
5000
<p>
5001 5002
When <code>main.main()</code> returns, the program exits.  It does not wait for
other (non-<code>main</code>) goroutines to complete.
Rob Pike's avatar
Rob Pike committed
5003
</p>
Rob Pike's avatar
Rob Pike committed
5004 5005
<p>
Implementation restriction: The compiler assumes package <code>main</code>
5006
is not imported by any other package.
Rob Pike's avatar
Rob Pike committed
5007
</p>
5008

Evan Shaw's avatar
Evan Shaw committed
5009
<h2 id="Run_time_panics">Run-time panics</h2>
Rob Pike's avatar
Rob Pike committed
5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030

<p>
Execution errors such as attempting to index an array out
of bounds trigger a <i>run-time panic</i> equivalent to a call of
the built-in function <a href="#Handling_panics"><code>panic</code></a>
with a value of the implementation-defined interface type <code>runtime.Error</code>.
That type defines at least the method
<code>String() string</code>.  The exact error values that
represent distinct run-time error conditions are unspecified,
at least for now.
</p>

<pre>
package runtime

type Error interface {
	String() string
	// and perhaps others
}
</pre>

5031
<h2 id="System_considerations">System considerations</h2>
5032

5033
<h3 id="Package_unsafe">Package <code>unsafe</code></h3>
5034

5035
<p>
Rob Pike's avatar
Rob Pike committed
5036 5037 5038 5039 5040
The built-in package <code>unsafe</code>, known to the compiler,
provides facilities for low-level programming including operations
that violate the type system. A package using <code>unsafe</code>
must be vetted manually for type safety.  The package provides the
following interface:
5041
</p>
5042

Rob Pike's avatar
Rob Pike committed
5043
<pre class="grammar">
5044
package unsafe
5045

5046 5047
type ArbitraryType int  // shorthand for an arbitrary Go type; it is not a real type
type Pointer *ArbitraryType
5048

5049 5050 5051
func Alignof(variable ArbitraryType) int
func Offsetof(selector ArbitraryType) int
func Sizeof(variable ArbitraryType) int
Rob Pike's avatar
Rob Pike committed
5052 5053 5054 5055

func Reflect(val interface {}) (typ runtime.Type, addr uintptr)
func Typeof(val interface {}) reflect.Type
func Unreflect(typ runtime.Type, addr uintptr) interface{}
5056
</pre>
5057

5058
<p>
5059 5060 5061
Any pointer or value of type <code>uintptr</code> can be converted into
a <code>Pointer</code> and vice versa.
</p>
5062
<p>
5063
The function <code>Sizeof</code> takes an expression denoting a
5064
variable of any type and returns the size of the variable in bytes.
5065
</p>
5066
<p>
5067
The function <code>Offsetof</code> takes a selector (§<a href="#Selectors">Selectors</a>) denoting a struct
5068
field of any type and returns the field offset in bytes relative to the
Rob Pike's avatar
Rob Pike committed
5069 5070
struct's address.
For a struct <code>s</code> with field <code>f</code>:
5071
</p>
5072

5073
<pre>
5074
uintptr(unsafe.Pointer(&amp;s)) + uintptr(unsafe.Offsetof(s.f)) == uintptr(unsafe.Pointer(&amp;s.f))
5075
</pre>
5076

5077
<p>
5078 5079 5080 5081 5082 5083 5084
Computer architectures may require memory addresses to be <i>aligned</i>;
that is, for addresses of a variable to be a multiple of a factor,
the variable's type's <i>alignment</i>.  The function <code>Alignof</code>
takes an expression denoting a variable of any type and returns the
alignment of the (type of the) variable in bytes.  For a variable
<code>x</code>:
</p>
5085

5086 5087 5088
<pre>
uintptr(unsafe.Pointer(&amp;x)) % uintptr(unsafe.Alignof(x)) == 0
</pre>
5089

5090 5091
<p>
Calls to <code>Alignof</code>, <code>Offsetof</code>, and
Rob Pike's avatar
Rob Pike committed
5092 5093 5094 5095 5096
<code>Sizeof</code> are compile-time constant expressions of type <code>int</code>.
</p>
<p>
The functions <code>unsafe.Typeof</code>,
<code>unsafe.Reflect</code>,
Russ Cox's avatar
Russ Cox committed
5097
and <code>unsafe.Unreflect</code> allow access at run time to the dynamic
Rob Pike's avatar
Rob Pike committed
5098 5099 5100 5101 5102 5103 5104 5105 5106 5107
types and values stored in interfaces.
<code>Typeof</code> returns a representation of
<code>val</code>'s
dynamic type as a <code>runtime.Type</code>.
<code>Reflect</code> allocates a copy of
<code>val</code>'s dynamic
value and returns both the type and the address of the copy.
<code>Unreflect</code> inverts <code>Reflect</code>,
creating an
interface value from a type and address.
5108
The <a href="/pkg/reflect/"><code>reflect</code> package</a> built on these primitives
Rob Pike's avatar
Rob Pike committed
5109
provides a safe, more convenient way to inspect interface values.
5110
</p>
5111

5112

5113
<h3 id="Size_and_alignment_guarantees">Size and alignment guarantees</h3>
5114

5115
<p>
5116
For the numeric types (§<a href="#Numeric_types">Numeric types</a>), the following sizes are guaranteed:
5117
</p>
5118

Rob Pike's avatar
Rob Pike committed
5119
<pre class="grammar">
5120
type                      size in bytes
5121

5122 5123 5124 5125 5126
byte, uint8, int8         1
uint16, int16             2
uint32, int32, float32    4
uint64, int64, float64    8
</pre>
5127

5128
<p>
5129
The following minimal alignment properties are guaranteed:
Rob Pike's avatar
Rob Pike committed
5130
</p>
5131
<ol>
5132
<li>For a variable <code>x</code> of any type: <code>1 <= unsafe.Alignof(x) <= unsafe.Maxalign</code>.
5133
</li>
5134

5135
<li>For a variable <code>x</code> of numeric type: <code>unsafe.Alignof(x)</code> is the smaller
5136
   of <code>unsafe.Sizeof(x)</code> and <code>unsafe.Maxalign</code>, but at least 1.
5137
</li>
5138

5139 5140
<li>For a variable <code>x</code> of struct type: <code>unsafe.Alignof(x)</code> is the largest of
   all the values <code>unsafe.Alignof(x.f)</code> for each field <code>f</code> of x, but at least 1.
5141
</li>
5142

5143 5144
<li>For a variable <code>x</code> of array type: <code>unsafe.Alignof(x)</code> is the same as
   <code>unsafe.Alignof(x[0])</code>, but at least 1.
5145
</li>
5146
</ol>
5147

Robert Griesemer's avatar
Robert Griesemer committed
5148
<h2 id="Implementation_differences"><span class="alert">Implementation differences - TODO</span></h2>
5149
<ul>
Robert Griesemer's avatar
Robert Griesemer committed
5150
	<li><span class="alert">Implementation does not honor the restriction on goto statements and targets (no intervening declarations).</span></li>
5151
	<li><span class="alert">Method expressions are partially implemented.</span></li>
Russ Cox's avatar
Russ Cox committed
5152
	<li><span class="alert">Gccgo: allows only one init() function per source file.</span></li>
5153
</ul>