golang教程之switch语句
switch语句
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
将手指的值与每个case语句进行比较。 案例从上到下进行评估,并执行与表达式匹配的第一个案例。在这种情况下,finger的值为4,因此打印Ring
。
不允许具有相同常量值的重复case
。 如果你试图运行下面的程序,编译器会报错main.go:18:2: duplicate case 4 in switch previous case at tmp/sandbox887814166/main.go:16:7
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://duplicate case
fmt.Println("Another Ring")
case 5:
fmt.Println("Pinky")
}
}
默认情况
我们手中只有5个手指。 如果输入错误的手指号码会发生什么。 这是默认情况下的情况。 当没有其他情况匹配时,将执行默认情况。
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")
}
}
在上面的程序中,手指是8并且它与任何情况都不匹配,因此打印了不正确的手指号码。 默认值不一定是switch语句中的最后一种情况。 它可以出现在任何位置。
您可能还注意到手指声明中的一个小变化。 它在交换机本身中声明。 开关可以包括在评估表达式之前执行的可选语句。 在这行switch finger:= 8;
首先声明手指并在表达式中使用。 在这种情况下,手指的范围仅限于switch
块。
多个表达式
通过用逗号分隔它们,可以在一个案例中包含多个表达式。
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")
}
}
上面的程序检查字母是否是元音。“a”,“e”,“i”,“o”,“u”:`匹配所有元音。 该程序输出元音。
无表达式的switch
表达式中的表达式是可选的,可以省略。 如果省略表达式,则认为switch
为真,并且每个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")
}
}
在上述程序中,表达式在开关中不存在,因此它被认为是真实的并且评估了每种情况。 case num> = 51 && num <= 100:
为true且程序输出num大于51且小于100.这种类型的开关可以被视为多个if else
子句的替代。
Fallthrough
在Go中,控件在执行case
后立即从switch
语句中出来。 fallthrough
语句用于将控制转移到在已执行的case
之后立即出现的case
的第一个语句。
让我们写一个程序来了解fallthrough
。 我们的程序将检查输入数字是否小于50,100或200.例如,如果我们输入75,程序将打印75小于100和200.我们将使用fallthrough
实现此输出。
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)
}
}
Switch和case表达式不一定只是常量。 它们也可以在运行时进行评估。 在上面的程序中,num初始化为函数number()
的返回值。 控制器进入开关内部并评估。 case num <100:
为true且程序打印75小于100.下一个语句是fallthrough
。 当遇到fallthrough
时,控件移动到下一个case的第一个语句,并且打印75小于200.程序的输出是
75 is lesser than 100
75 is lesser than 200
fallthrough
应该是case中的最后一个语句。 如果它出现在中间的某个位置,编译器将抛出错误的fallthrough
语句
上一篇: RestTemplate 使用
下一篇: Redis中Scan命令的踩坑实录