类似于C,Go的规范语法是使用分号来终结语句的。但是于C不同的是,这些分号并不在源码中出现。词法分析器会在扫描时,使用简单的规则自动插入分号,因此输入文本中大部分是没有分号的。 规则是这样的,如果在换行之前的最后一个符号为一个标识符(包括像`int`和`float64`这样的单词),一个基本的文字,例如数字或者字符串常量,或者如下的一个符号 ~~~ break continue fallthrough return ++ -- ) } ~~~ 则词法分析器总是会在符号之后插入一个分号。这可以总结为“如果换行出现在可以结束一条语句的符号之后,则插入一个分号”。 紧挨着右大括号之前的分号也可以省略掉,这样,语句 ~~~ go func() { for { dst <- <-src } }() ~~~ 就不需要分号。地道的Go程序只在`for`循环子句中使用分号,来分开初始化,条件和继续执行,这些元素。分号也用于在一行中分开多条语句,这也是你编写代码应该采用的方式。 分号插入规则所导致的一个结果是,你不能将控制结构(`if`,`for`,`switch`或`select`)的左大括号放在下一行。如果这样做,则会在大括号之前插入一个分号,这将会带来不是想要的效果。应该这样编写 ~~~ if i < f() { g() } ~~~ 而不是这样 ~~~ if i < f() // wrong! { // wrong! g() } ~~~