插入规则
- 在 Go 代码中,注释除外,如果一个代码行的最后一个语法词段(token)为下列所示之一,则一个分号将自动插入在此字段后(即行尾):
- 一个标识符
- 一个整数、浮点数、虚部、码点或者字符串字面表示形式
- 这几个跳转关键字之一:break、continue、fallthrough 和 return
- 自增运算符++或者自减运算符–
- 一个右括号:) ] }
- 为了允许一条复杂语句完全显示在一个代码行中,分号可能被插入在一个右小括号)或者右大括号}之前
举例
package main
func f() bool {return false}
func main() {
switch f()
{
case true: println(true)
case false: println(false)
}
}
以上代码打印出的结果为:true
原因就是,Go 语言的分号自动插入规则导致的,当我们将分号补齐后,再看看代码结构
package main;
func f() bool {return false;};
func main() {
switch f();
{
case true: println(true);
case false: println(false);
};
};
以上添加分号的地方,除了 main 和 false 的地方是因为是 Go 语言的标识符所添加的,剩下的全部是因为右括号所添加的分号。
这里如果还没有理解为什么打印 true,我们可以细看下 Go 里面的 Switch 语法格式:
switch InitSimpleStatement; CompareOperand0 {
case CompareOperandList1:
// do something
case CompareOperandList2:
// do something
...
default:
// do something
}
表达式 CompareOperand0 可以不出现(被省略)。如果它被省略,则它的值将被视为 true。
所以编辑器会在 f() 后面添加一个 true,这样执行的结果都为 true。
如果用 go.fmt 来统一风格,程序会自动将 switch 的左括号放置在 f() 之后,这样编辑器就不会在 f() 之后添加分号,也就不会有默认值,程序就是我们正常理解的逻辑。