773 words
4 minutes
Go语言教程:switch的用法
这是一篇关于Go语言中switch语句的教程。通过对示例代码的分析,我们可以深入理解switch语句的用法和注意事项。
switch语句基本语法
switch语句的基本语法如下:
switch 表达式 {
case 表达式1:
// 代码块1
case 表达式2:
// 代码块2
default:
// 默认代码块
}
switch语句会根据表达式的值,与case后的表达式进行匹配。如果匹配成功,就执行对应的代码块;如果都不匹配,就执行default代码块。
case表达式的限制
在示例1中,我们看到下面的代码无法编译通过:
value3 := [...]int8{0, 1, 2, 3, 4, 5, 6}
switch value3[4] {
case 0, 1, 2:
fmt.Println("0 or 1 or 2")
case 2, 3, 4:
fmt.Println("2 or 3 or 4")
case 4, 5, 6:
fmt.Println("4 or 5 or 6")
}
这是因为case后的表达式中,不能有重复的值。在上面的代码中,2和4都出现了两次,所以编译器会报错。
case表达式的类型
在示例2中,我们看到case后的表达式可以是一个值,也可以是一个变量:
value5 := [...]int8{0, 1, 2, 3, 4, 5, 6}
switch value5[4] {
case value5[0], value5[1], value5[2]:
fmt.Println("0 or 1 or 2")
case value5[2], value5[3], value5[4]:
fmt.Println("2 or 3 or 4")
case value5[4], value5[5], value5[6]:
fmt.Println("4 or 5 or 6")
}
case后的表达式类型必须与switch表达式的类型一致。在这个例子中,value5是int8类型,所以case后的表达式也必须是int8类型。
Type Switch
除了对值进行判断,switch还可以对变量的类型进行判断,这就是Type Switch。示例3展示了一个Type Switch的例子:
value6 := interface{}(byte(127))
switch t := value6.(type) {
case uint8, uint16:
fmt.Println("uint8 or uint16")
case byte:
fmt.Printf("byte")
default:
fmt.Printf("unsupported type: %T", t)
}
这个例子中,value6是一个空接口类型的变量,它的实际类型是byte。通过t := value6.(type)语句,可以获取到value6的实际类型,并赋值给变量t。
然后,switch会根据t的类型,与case后声明的类型进行匹配。需要注意的是,case后只能是类型,不能是表达式。
switch表达式的限制
最后,我们再来看一个无法编译通过的例子:
value1 := [...]int8{0, 1, 2, 3, 4, 5, 6}
switch 1 + 3 {
case value1[0], value1[1]:
fmt.Println("0 or 1")
case value1[2], value1[3]:
fmt.Println("2 or 3")
case value1[4], value1[5], value1[6]:
fmt.Println("4 or 5 or 6")
}
switch后的表达式必须是一个单一的值,不能是表达式。1 + 3是一个表达式,所以编译器会报错。
总结
通过以上示例,我们可以总结出switch语句的几个关键点:
- case后的表达式不能有重复值。
- case后的表达式类型必须与switch表达式的类型一致。
- 可以使用Type Switch对变量的类型进行判断。
- switch后的表达式必须是一个单一的值,不能是表达式。
希望通过这篇教程,你能够更好地理解和运用Go语言的switch语句。在实际开发中,灵活运用switch语句可以让代码更加简洁和易读。
Go语言教程:switch的用法
https://blog.ithuo.net/posts/go-language-uses-switch/