类似于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()
}