Go语言小细节——分号自动插入规则

插入规则

  • 在 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() 之后添加分号,也就不会有默认值,程序就是我们正常理解的逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值