学习Golang:switch
链式条件
对于一个程序来说,有一连串的条件语句来测试同一个变量或函数结果的不同值,是一种常见的模式。
比如说:
package main
import (
"fmt"
)
func main() {
x := 0
y := 0
for command := ""; command != "end"; {
fmt.Print("Command? ")
fmt.Scan(&command)
if command == "up" {
y -= 1
} else if command == "down" {
y += 1
} else if command == "left" {
x -= 1
} else if command == "right" {
x += 1
} else if command == "end" {
fmt.Println("Exiting.")
} else {
fmt.Printf("Invalid command: %v\n", command)
}
fmt.Printf("x=%v, y=%v\n", x, y)
}
}
这个程序产生的输出是这样的:
❯ bin/go run ./switch/if-else.go
Command? right
x=1, y=0
Command? down
x=1, y=1
Command? right
x=2, y=1
Command? up
x=2, y=0
Command? left
x=1, y=0
Command? back
Invalid command: back
x=1, y=0
Command? end
Exiting.
x=1, y=0
注意连锁的if 语句在测试command 的不同值。
switch 语句可以用来简化这样的代码,使模式更加明显。
开关
switch 语句将执行第一个与它的操作数的值相匹配的case 表达式中的语句。
比如说:
package main
import (
"fmt"
)
func main() {
x := 0
y := 0
for command := ""; command != "end"; {
fmt.Print("Command? ")
fmt.Scan(&command)
switch command {
case "up":
y -= 1
case "down":
y += 1
case "left":
x -= 1
case "right":
x += 1
case "end":
fmt.Println("Exiting.")
default:
fmt.Printf("Invalid command: %v\n", command)
}
fmt.Printf("x=%v, y=%v\n", x, y)
}
}
这个程序产生的输出是这样的:
❯ bin/go run ./switch/switch.go
Command? right
x=1, y=0
Command? down
x=1, y=1
Command? right
x=2, y=1
Command? up
x=2, y=0
Command? left
x=1, y=0
Command? back
Invalid command: back
x=1, y=0
Command? end
Exiting.
x=1, y=0
注意每个case 表达式是如何检查同一变量的不同值的(command)。
如果没有一个case 表达式匹配,default 案例中的语句将被执行。
变量案例条件
case 表达式中的值不需要是一个常数字面。它可以是一个变量,或者是一个函数调用的返回值。
比如说
package main
import (
"fmt"
)
func main() {
x := 0
y := 0
endCommand := "end"
for command := ""; command != endCommand; {
fmt.Print("Command? ")
fmt.Scan(&command)
switch command {
case "up":
y -= 1
case "down":
y += 1
case "left":
x -= 1
case "right":
x += 1
case endCommand:
fmt.Println("Exiting.")
default:
fmt.Printf("Invalid command: %v\n", command)
}
fmt.Printf("x=%v, y=%v\n", x, y)
}
}
这个程序产生的输出是这样的:
❯ bin/go run ./switch/switch.go
Command? end
Exiting.
x=0, y=0
请注意,程序没有检查字面意思"end" ,而是检查了endCommand 这个变量的值。
总结
当有一连串的条件语句测试同一变量或函数结果的不同值时,switch 语句提高了代码的可读性。
第一个匹配的case 表达式的语句将被执行。如果没有匹配的case 表达式,那么将执行default 语句,如果它们存在的话。