文章目录
- Go语言-switch case
- 背景
- switch case
- Golang中switch的特殊用法——fallthrough
- go语言switch中判断多个值
- Type Switch,判断某个 interface 变量中实际存储的变量类型
- golang switch支持哪些数据类型
- 工作中遇到问题,interface conversion: interface {} is float64, not int
- go语言中switch语句的注意事项
Go语言-switch case
背景
当嵌套的 if 比较少时(三个以内),用 if 编写程序会比较简洁。但是当选择的分支比较多时,嵌套的 if 语句层数就会很多,导致程序冗长,可读性下降。因此用 switch 语句来处理多分支选择。
Golang语言在流程控制方面也有其他语言所具备的 if、switch、for 三剑客。其中,if、for 用法基本上还算一致。switch的用法差异确实有些大。
- switch 和其他语言最为不同的一点:没有 break 语句,每个 case 默认都带着break 语句。
- Golang中switch的特殊用法——fallthrough。 fallthrough 语句的作用是强制执行case后面的没有执行的case代码
switch case
switch 是一个条件语句,用于将一个表达式的求值结果与可能的值的列表进行匹配,并根据匹配结果执行相应的代码。可以认为 switch 语句是编写多个 if-else 子句的替代方式。比较 C 和 Java 等其它语言而言,Go 语言中的 switch 结构使用上更加灵活。
switch var1 { //前花括号 { 必须和 switch 关键字在同一行。
case val1:
...
case val2:
...
default:
...
}
case
每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。(Go 语言使用快速的查找算法来测试 switch 条件与 case 分支的匹配情况,直到算法匹配到某个 case 或者进入 default 条件为止)。一旦成功地匹配到某个分支,在执行完相应代码后就会退出整个 switch 代码块,也就是说不需要特别使用 break 语句来表示结束。因此,程序也不会自动地去执行下一个分支的代码。
在 case 语句之后,不需要使用花括号将多行语句括起来。当代码块只有一行时,可以直接放置在 case 语句之后。可以使用 return 语句来提前结束代码块的执行。
default
可选的 default 分支可以出现在任何顺序,但最好将它放在最后。它的作用类似与 if-else 语句中的 else,表示不符合任何已给出条件时执行的相关语句。
fallthrough
如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用 fallthrough 关键字来达到目的。
Golang中switch的特殊用法——fallthrough
switch 从第一个判断表达式为 true 的 case 开始执行,如果 case 带有 fallthrough,程序会继续执行下一条 case,且它不会去判断下一个 case 的表达式是否为 true。
package main
import "fmt"
func main() {
num := 2
switch num{
case 1:
fmt.Println("num的数值是1")
case 2:
fmt.Println("num的数值是2")
fallthrough
case 3:
fmt.Println("num的数值是3")
case 4,5,6:
fmt.Println("num的数值可能是4,5,6")
default:
fmt.Println("执行default语句")
}
fmt.Println("程序结束了")
}
go语言switch中判断多个值
go语言中的switch语句,可以非常容易的判断多个值的情况。
go语言switch语句,可以同时匹配多个条件,中间用逗号分隔,有其中一个匹配成功即可
package main
import "fmt"
func judge(v int) {
switch v {
case 1, 3:
{
fmt.Println("v的值为", v)
}
default:
{
fmt.Println("未匹配到,v的值为", v)
}
}
}
func main() {
a := 1
judge(a)
a = 2
judge(a)
a = 3
judge(a)
}
代码执行结果:
num的数值是2
num的数值是3
程序结束了
通过代码,我们可以知道 fallthrough 只作用于当前 case,只多向下执行一个 case,而不是执行整个 switch 语句。
Type Switch,判断某个 interface 变量中实际存储的变量类型
switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
Type Switch 语法格式如下:
switch x.(type){
case type:
statement(s);
case type:
statement(s);
/* 你可以定义任意个数的case */
default: /* 可选 */
statement(s);
}
以上代码执行结果为:
x 的类型 :
golang switch支持哪些数据类型
Java支持
1.switch表达式后面的数据类型只支持byte,short,int整形类型、字符类型char、枚举类型和java.lang.String类型。
2.注意:支持byte,short,int的包装类,因为会自动拆箱
Go语言的switch
支持任何类型
测试一下 float64
package main
import "fmt"
func main() {
var num float64
num = 1.0
switch num {
case 1:
fmt.Println("num的数值是1")
case 2:
fmt.Println("num的数值是2")
fallthrough
case 3:
fmt.Println("num的数值是3")
case 4, 5, 6:
fmt.Println("num的数值可能是4,5,6")
default:
fmt.Println("执行default语句")
}
fmt.Println("程序结束了")
}
工作中遇到问题,interface conversion: interface {} is float64, not int
问题描述:
工作遇到,使用 map[string]interface{} json映射到map,拿到一个变量,日志打印出来是 1,但是 switch case 是1的死活匹配不上。
先debug,发现我的数据是float64类型,但是写demo float64 go 的switch应该也支持呀。为了更保险,一般case 都用整数,所以我考虑先强转为int。结果发生报错: interface conversion: interface {} is float64, not int
问题分析:
interface {} 接口类型不可以直接强转成 int 整形类型。 interface {} 接口类型是 float64 类型,如果想要得到 int 整形数值,需要先转换成 float 类型。
注意:不要只看打印,你看打印结果是1但是却没有匹配到
case 1:
, interface{} 用之前都得手工转xxx.(float64)
,打印能打出来,是因为go打印时自己内部做了这个工作。
其他参考
解决:interface conversion: interface {} is float64, not int
参考URL: https://developer.aliyun.com/article/850297
go语言中switch语句的注意事项
go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch