Go语言switch默认表达式语法疑问:为何输出为1?
Go Switch语法疑问解答
示例代码
package main import "fmt" func ExampleSwitchGo101_1() { f := func() bool { return false } switch f() // "{" is on next line, go compiler will insert a ";" here, // and the default switch value is true, { case true: fmt.Println(1) case false: fmt.Println(0) } // Output: // 1 }
这段代码的输出为1而非0,核心原因是Go的switch语法规则导致匹配值为true。
技术问题解答
1. 此处存在多少个switch语句?
这里只有1个switch语句。你误以为会被拆分为两个,是对Go自动分号插入规则和switch语法的组合理解有误。
2. 关于矛盾点的解释
- 2-1 单独写
switch f()报错,是因为Go语法要求switch语句必须包含对应的case/default分支块,仅写switch f()缺少分支块,属于语法不完整; - 2-2 单独写
{case ... }本身就是非法语法,case是switch语句的专属子句,不能独立出现在普通代码块中。
3. 单switch语句的语法逻辑
Go的自动分号插入规则会在switch f()行尾插入分号,使得代码等价于:
switch f(); { case true: fmt.Println(1) case false: fmt.Println(0) }
根据Go语法,switch语句允许在开头添加一个前置简单语句(这里的f()就是),随后可以省略匹配表达式——省略时默认匹配值为布尔值true。
整个执行逻辑为:
- 先执行前置简单语句
f(),其返回值false被忽略; - switch使用默认匹配值
true; - 匹配第一个
case true分支,执行fmt.Println(1),最终输出结果为1。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

