Goswitch教程展示了如何在Golang中使用switch语句。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
转到switch语句
Goswitch语句提供了多路执行。将表达式或类型说明符与开关内的案例进行比较,以确定要执行的分支。与C、Java或PHP等其他语言不同,每个case都由隐式中断终止;因此,我们不必明确地写出来。
切换案例从上到下评估案例,当案例成功时停止。Switch语句适用于任何类型的值,而不仅仅是整数。
switch语句有两种类型:switch表达式和switch类型。我们可以在同一个case语句中使用逗号分隔多个表达式。不带表达式的switch是表达if/else逻辑的另一种方式。
当没有其他情况适合时,default
语句可用于执行的分支。default
语句是可选的。
转到切换示例
以下是Go中switch语句的一个简单示例。
package main import ( "fmt" "time" ) func main() { switch time.Now().Weekday() { case time.Monday: fmt.Println("Today is Monday.") case time.Tuesday: fmt.Println("Today is Tuesday.") case time.Wednesday: fmt.Println("Today is Wednesday.") case time.Thursday: fmt.Println("Today is Thursday.") case time.Friday: fmt.Println("Today is Friday.") case time.Saturday: fmt.Println("Today is Saturday.") case time.Sunday: fmt.Println("Today is Sunday.") } }
在代码示例中,我们找出当前工作日并打印相应的消息。
switch time.Now().Weekday() {
switch
语句接受一个表达式,其计算结果为当前工作日。
case time.Monday: fmt.Println("Today is Monday.")
如果工作日的计算结果为time.Monday
,我们将打印“今天是星期一”消息。
去切换多个表达式
可以在一种情况下放置多个表达式。
package main import ( "time" "fmt" ) func main() { switch time.Now().Weekday() { case time.Monday, time.Tuesday, time.Wednesday, time.Thursday, time.Friday: fmt.Println("weekday") case time.Saturday, time.Sunday: fmt.Println("weekend") } }
该示例打印工作日或周末,具体取决于两个case语句中多个表达式的评估。
转到默认值
default
语句可用于所有不符合指定情况的值。
package main import ( "fmt" ) func main() { size := "XXXL" switch size { case "XXS": fmt.Println("extra extra small") case "XS": fmt.Println("extra small") case "S": fmt.Println("small") case "M": fmt.Println("medium") case "L": fmt.Println("large") case "XL": fmt.Println("extra large") case "XXL": fmt.Println("extra extra large") default: fmt.Println("unknown") } }
该示例检查衣服的尺寸。如果使用了无法识别的值,它会向终端打印“未知”。
Goswitch可选语句
可选的初始化语句可以在switch表达式之前。初始化语句和表达式用分号分隔。
package main import ( "fmt" ) func main() { switch num := 6; num % 2 == 0 { case true: fmt.Println("even value") case false: fmt.Println("odd value") } }
在代码示例中,我们同时拥有开关初始值设定项和表达式。switch语句确定值是偶数还是奇数。
switch num := 6; num % 2 == 0 {
num:=6
是开关初始值设定项,num%2
是开关表达式。
转到switchbreak语句
Go对每种情况都使用隐式break
语句。这与C或Java等语言不同,在这些语言中break
是必需的。我们还可以在需要时显式指定break
。
package main import ( "fmt" ) func main() { w := "a b c\td\nefg hi" for _, e := range w { switch e { case ' ', '\t', '\n': break default: fmt.Printf("%c\n", e) } } }
在代码示例中,我们循环遍历包含空格的字符串。仅打印非空白区域。
w := "a b c\td\nefg hi"
我们在字符串中有一个空格、一个制表符和一个换行空白字符。
for _, e := range w {
我们使用forrange
循环遍历字符串元素。
switch e { case ' ', '\t', '\n': break
如果遇到指定的三个空格,我们将使用break
终止switch
语句。
$ go run explicit_break.go a b c d e f g h i
不带表达式去switch
当不使用表达式时,switch
语句实际上等于switchtrue
。这种形式可以用来代替多行if/else语句来缩短代码。
package main import ( "time" "fmt" ) func main() { now := time.Now() switch { case now.Hour() < 12: fmt.Println("AM") default: fmt.Println("PM") } }
根据当前时间,示例打印AM
或PM
。
去切换fallthrough
我们可以使用fallthrough
关键字转到下一个案例。
package main import ( "fmt" ) // A -> B -> C -> D -> E func main() { nextstop := "B" fmt.Println("Stops ahead of us:") switch nextstop { case "A": fmt.Println("A") fallthrough case "B": fmt.Println("B") fallthrough case "C": fmt.Println("C") fallthrough case "D": fmt.Println("D") fallthrough case "E": fmt.Println("E") } }
想象一下,我们从A站走到E站。我们根据下一个可见的站点来确定我们前面有多少个站点。
$ go run fallthrough.go Stops ahead of us: B C D E
Go类型开关
通过类型开关,我们可以切换接口值的类型。
package main import "fmt" func main() { var data interface{} data = 112523652346.23463246345 switch mytype:= data.(type) { case string: fmt.Println("string") case bool: fmt.Println("boolean") case float64: fmt.Println("float64 type") case float32: fmt.Println("float32 type") case int: fmt.Println("int") default: fmt.Printf("%T", mytype) } }
在代码示例中,我们打印了一个值的数据类型。
case bool: fmt.Println("boolean")
对于bool
类型,我们打印“boolean”。
$ go run type_switch.go float64 type
112523652346.23463246345
值是一个float64
。
在本教程中,我们介绍了Golang中的switch语句。
列出所有Go教程。