学习Golang中switch语言的详细指南

243 阅读2分钟

学习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 语句,如果它们存在的话。