<h2 id=\"介绍\"><a href=\"#介绍\" id=\"介绍\">介绍</a></h2>\n<p>这是一个 Go 语言的参考手册,你也可以访问<a href=\"https://golang.org/\" rel=\"nofollow\" target=\"_blank\">golang.org</a>获取更多信息和其他文档。</p>\n<p>Go 是在设计时考虑了系统编程的通用型编程语言。它是强类型,有垃圾回收机制并原生支持并发编程。Go 程序由一个或多个 package 组成,这样可以高效的管理依赖。</p>\n<p>Go 的语法简洁且有规则,这让自动化工具可以很容易的分析代码,例如:集成开发环境。</p>\n<h2 id=\"标记\"><a href=\"#标记\" id=\"标记\">标记</a></h2>\n<p>语法采用扩展巴科斯范式。</p>\n<pre><code class=\"language-go\">Production = production_name "=" [ Expression ] "." .\nExpression = Alternative { "|" Alternative } .\nAlternative = Term { Term } .\nTerm = production_name | token [ "…" token ] | Group | Option | Repetition .\nGroup = "(" Expression ")" .\nOption = "[" Expression "]" .\nRepetition = "{" Expression "}" .\n</code></pre>\n<p>产生式是由词法单元和以下操作符构成的表达式(优先级依次递增):</p>\n<pre><code class=\"language-go\">| 或\n() 分组\n[] 可选 (出现 0 或 1 次)\n{} 可重复 (出现 0 到 n 次)\n</code></pre>\n<p>小写的产生式名称用来与词法单元区分。非终结符采用驼峰式。词法单元由双引号或反引号组成。</p>\n<p><code>a...b</code> 表示从 <code>a</code> 到 <code>b</code> 之间的任意字符。省略号 <code>...</code> 也可以在规范中表示对更详细的枚举和代码片段的省略。字符 <code>...</code> 不是 Go 语言的词法单元。</p>\n<h2 id=\"源码表示法\"><a href=\"#源码表示法\" id=\"源码表示法\">源码表示法</a></h2>\n<p>Go 的源代码使用 UTF-8 编码的 Unicode 文本。不过它并不是完全规范化的,单重音的代码点与由相同字符和音标组成的代码点是不同的;前者我们认为它是两个代码点。简单来讲,文档会在源代码文本中使用非规范的术语字符来表示一个 Unicode 代码点。</p>\n<p>每个代码点都是不同的;相同字符的大写和小写形式表示不同的字符。</p>\n<p>实现限制:为了兼容其他工具,编译器不允许出现 Utf-8 编码的源文本中的 NUL 字符(U+0000)。</p>\n<p>实现限制:为了兼容其他工具,如果源文本中是以Utf-8 编码的字节序标记(U+FEFF)为起始代码点。编译器会忽略它。字节序标记不应出现在源文本的任何位置。</p>\n<h4 id=\"字符\"><a href=\"#字符\" id=\"字符\">字符</a></h4>\n<p>这些单词表示 Unicode 字符的类别:</p>\n<pre><code class=\"language-go\">newline = /* Unicode 代码点 U+000A */ .\nunicode_char = /* 排除换行以外的任意 Unicode 代码点 */ .\nunicode_letter = /* 一个字母("Letter")类型的 Unicode 代码点 */ .\nunicode_digit = /* 一个数字("Number, decimal digit")类型的 Unicode 代码点 */ .\n</code></pre>\n<p>在 Unicode8.0 标准中,第 4.5 章节 “一般类别” 中定义了字符的类别。Go 能够处理任何字符集,包括 Lu,Li,Lt,Lm 或 Lo 作为 Unicode 字母,还可以把数字字符集 Nd 当作 Unicode 数字处理。</p>\n<h4 id=\"字母和数字\"><a href=\"#字母和数字\" id=\"字母和数字\">字母和数字</a></h4>\n<p>我们认为下划线 <code>_</code> (U+005F)是一个字母:</p>\n<pre><code class=\"language-go\">letter = unicode_letter | "_" .\ndecimal_digit = "0" … "9" .\noctal_digit = "0" … "7" .\nhex_digit = "0" … "9" | "A" … "F" | "a" … "f" .\n</code></pre>\n<h2 id=\"词汇元素\"><a href=\"#词汇元素\" id=\"词汇元素\">词汇元素</a></h2>\n<h4 id=\"注释\"><a href=\"#注释\" id=\"注释\">注释</a></h4>\n<p>注释是程序的说明文档。在 Go 中有两种形式:</p>\n<ul>\n<li>单行注释从 <code>//</code> 开始直到行末结束。</li>\n<li>通用注释从 <code>/*</code> 开始直到 <code>*/</code> 结束。</li>\n</ul>\n<p>注释不能嵌套在其他注释、字符串和 rune 的字面值中。不包含换行符的通用注释之间通过空格符连接,其他情况下每段注释都会另起一行。</p>\n<h4 id=\"词汇元素\"><a href=\"#词汇元素\" id=\"词汇元素\">词汇元素</a></h4>\n<p>词汇元素构成了 Go 语言的词汇表。它有四种类型:标识符、关键字、操作符/标点符号、字面值。空白符可以是空格(U+0020)、水平制表符(U+0009)、换行符(U+000D)或换行符(U+000A)。它本身会被忽略,一般用来区分不同的词汇元素。换行符或文件终止符(EOF)还可能触发编译程序在源代码的行末或文件末尾追加分号。在分解源代码的词汇元素的过程中,会把当前可以形成有效词汇元素的最长字符序列作为下一个词汇元素。</p>\n<h4 id=\"分号\"><a href=\"#分号\" id=\"分号\">分号</a></h4>\n<p>正规语法在很多产生式中使用分号 “;” 作为终结符。Go 程序中遵循下面两条规则省略了大部分的分号:</p>\n<ol>\n<li>当某行的最后一个词汇元素是以下元素时自动补全分号:</li>\n</ol>\n<ul>\n<li>一个标识符。</li>\n<li>一个整数,浮点数,虚数,rune 或字符串字面值。</li>\n<li>\n<p>关键字 <code>break</code>、<code>continue</code>、<code>fallthrough</code> 和 <code>return</code> 其中之一。</p>\n</li>\n<li>操作符/标点符号 <code>++</code>,<code>--</code>,<code>)</code>,<code>]</code> 和 <code>}</code> 其中之一。</li>\n</ul>\n<ol>\n<li>为了支持独占一行的复杂语句,会省略与 “)” 或 “}” 相邻的分号。</li>\n</ol>\n<p>为了反应惯用用途,本篇文档的所有例子都基于以上规则省略分号。</p>\n<h4 id=\"标识符\"><a href=\"#标识符\" id=\"标识符\">标识符</a></h4>\n<p>标识符表示程序实体单元,例如:变量、类型。一个标识符由一个或多个字母和数字组成。标识符的首字符必须为字母。</p>\n<pre><code class=\"language-go\">identifier = letter { letter | unicode_digit } .\n</code></pre>\n<pre><code class=\"language-go\">a\n_x9\nThisVariableIsExported\nαβ\n</code></pre>\n<p>Go 已经预定义了一些标识符。</p>\n<h4 id=\"关键字\"><a href=\"#关键字\" id=\"关键字\">关键字</a></h4>\n<p>以下关键字是预留的,它们不能作为标识符:</p>\n<pre><code class=\"language-go\">break default func interface select\ncase defer go map struct\nchan else goto package switch\nconst fallthrough if range type\ncontinue for import return var\n</code></pre>\n<h4 id=\"操作符和标点符号\"><a href=\"#操作符和标点符号\" id=\"操作符和标点符号\">操作符和标点符号</a></h4>\n<p>以下字符序列用于表示操作符(包括赋值运算符)和标点符号:</p>\n<pre><code class=\"language-go\">+ & += &= && == != ( )\n- | -= |= || < <= [ ]\n* ^ *= ^= <- > >= { }\n/ << /= <<= ++ = := , ;\n% >> %= >>= -- ! ... . :\n &^ &^=\n</code></pre>\n<h4 id=\"整型字面值\"><a hr