switch
属于条件判断语句,它会将表达式与一系列的 case
进行比较。当表达式与某个 case
匹配时,switch
就会执行该 case
的代码块。
switch
可以看做是多个if else
语句 的集合。
接下来,我们来写个程序,这个程序的功能是:根据手指编号,输出手指名,例如 1
是大拇指、2
是食指。
package main
import (
"fmt"
)
func main() {
finger := 4
switch finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4:
fmt.Println("Ring")
case 5:
fmt.Println("Pinky")
}
}
在上面的程序中,switch finger
表示:将 finger
与每个 case
进行比较。
switch
会根据 finger
的值,从上到下判断 case
。遇到首个满足条件的 case
时,switch
会执行该 case
的代码块。
运行程序,输出如下:
Ring
不同的 case
不允许判断相同的常量。例如下面的这种情况:
package main
import (
"fmt"
)
func main() {
finger := 4
switch finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4:
fmt.Println("Ring")
case 4: //重复的case
fmt.Println("Another Ring")
case 5:
fmt.Println("Pinky")
}
}
运行程序,编译器会抛出错误:
main.go:18:2: duplicate case 4 in switch previous case at tmp/sandbox887814166/main.go:16:7
case
一般来说,人的手指只有 5
根。如果手指编号是错误的,我们应该怎么处理呢?我们可以使用 默认case
。
当没有任何 case
匹配时,switch
会执行 默认case
的代码块。
package main
import (
"fmt"
)
func main() {
switch finger := 8; finger {
case 1:
fmt.Println("Thumb")
case 2:
fmt.Println("Index")
case 3:
fmt.Println("Middle")
case 4:
fmt.Println("Ring")
case 5:
fmt.Println("Pinky")
default: //default case
fmt.Println("incorrect finger number")
}
}
在上面的程序中,手指编号finger
等于 8
,该编号无法匹配任何 case
,于是 switch
会执行 默认case
的代码。
程序输出如下:
incorrect finger number
默认case
不一定需要写在 case
们 的最后,它可以放在 switch
内部 的任何地方。
仔细观察上面的程序,你会发现:声明 finger
变量 的方式 发生了变化,我们将它声明在了 switch
中。
定义 switch
时,我们可以添加一条可选的语句,这条语句会在 switch
判断前执行。
switch finger := 8; finger
表示:在 switch
语句 内声明并使用 finger
— 此时 finger
的作用域将被限制在 switch
代码块 中。
case
在同个 case
中,我们能放置多个表达式,这些表达式使用逗号进行分隔。
package main
import (
"fmt"
)
func main() {
letter := "i"
switch letter {
case "a", "e", "i", "o", "u": //multiple expressions in case
fmt.Println("vowel")
default:
fmt.Println("not a vowel")
}
}
上面的程序能判断 letter
是否为元音。
运行程序,输出如下:
vowel
switch
在 Go
语言 中,我们可以省略 switch
语句 的表达式。如果表达式被省略,switch
可以认为是 switch true
,此时 case
也需要作出些许改变。
package main
import (
"fmt"
)
func main() {
num := 75
switch {
// expression is omitted
case num >= 0 && num <= 50:
fmt.Println("num is greater than 0 and less than 50")
case num >= 51 && num <= 100:
fmt.Println("num is greater than 51 and less than 100")
case num >= 101:
fmt.Println("num is greater than 100")
}
}
在上面的程序中,我们省略了 switch
的表达式。可以注意到,此时 case
也做出了些许改变。
运行程序,输出如下:
num is greater than 51 and less than 100
fallthrough
在 Go
中,当首个 case
被执行后,程序会马上跳出 switch
。通过 fallthrough
,我们能让 switch
继续执行下一个 case
代码块。
通过程序来理解 fallthrough
。这个程序会检查输入是否小于 50
、100
、200
。举个例子,如果我们输入 75
,此时程序会输出 75 小于 100
、75 小于 200
。
程序如下:
package main
import (
"fmt"
)
func number() int {
num := 15 * 5
return num
}
func main() {
switch num := number(); {
//num is not a constant
case num < 50:
fmt.Printf("%d is lesser than 50\n", num)
fallthrough
case num < 100:
fmt.Printf("%d is lesser than 100\n", num)
fallthrough
case num < 200:
fmt.Printf("%d is lesser than 200", num)
}
}
在 Go
语言 中,我们能将变量作为 switch
、case
的表达式,程序运行时能评估这些表达式。
在上面的程序中,我们用 number
函数的返回值 初始化 num
变量。之后,程序会进入 switch
内部,评估每个 case
。
如果 case num < 100:
等于 true
,程序将会输出 75 is lesser than 100
。由于该 case
代码块 最后是 fallthrough
,于是程序会执行下一个 case
代码块,此时会再输出:75 is lesser than 200
。
最终,程序输出如下:
75 is lesser than 100
75 is lesser than 200
当 case
代码块 存在 fallthrough
时,fallthrough
必须位于该代码块的最后,否则,编译器会抛出错误:fallthrough statement out of place
。
上面就是普通的 switch
了,其实 Go
语言 还有一种 switch
— type switch
。我们将在 Go语言 接口 讨论 type switch
。
这就是 switch
了~
祝你头发茂密~
优质内容来之不易,您可以通过该 链接 为我捐赠。
感谢原作者的优质内容。
欢迎指出文中的任何错误。