switch语句

在本节介绍switch语句主要是因为switch可以用于正则表达式!首先看一段switch代码块:

  1. switch asString {
  2. case "1":
  3. fmt.Println("One")
  4. case "0":
  5. fmt.Println("Zero")
  6. default:
  7. fmt.Println("Do not care!")
  8. }

这段代码能够区分不同的asString值所对应的不同操作。

switch代码块设置default子句是非常棒的实践。由于switchcase语句是依赖顺序的,所以default子句总是在最后声明。

switch的使用还可以更加灵活:

switch {

case number < 0:

​ fmt.Println(“Less than zero”)

case number > 0:

​ fmt.Println(“Bigger than zero”)

default:

​ fmt.Println(“zero”)

}

上面的代码块能够在某个数字正数、负数、以及0的情况下执行不同的任务。如你所见,switch的分支语句可以是条件语句,那么其分支语句同样也可以是正则表达式!

关于switch的用法将在switch.go中分5部分展示。

第一部分:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "regexp"
  6. "strconv"
  7. )
  8. func main() {
  9. arguments := os.Args
  10. if len(arguments) <2 {
  11. fmt.Println("Usage: switch number")
  12. os.Exit(1)
  13. }

regex包用于生成正则表达。

第二部分代码:

  1. number, err := strconv.Atoi(arguments[1])
  2. if err != nil {
  3. fmt.Println("The value is not an integer",number)
  4. }else {
  5. switch {
  6. case number<0:
  7. fmt.Println("Less than zero")
  8. case number >0:
  9. fmt.Println("Bigger than zero")
  10. default:
  11. fmt.Println("Zero")
  12. }
  13. }

第三部分代码:

  1. asString := arguments[1]
  2. switch asString{
  3. case "5":
  4. fmt.Println("Five")
  5. case "0":
  6. fmt.Println("Zero")
  7. default:
  8. fmt.Println("Do not care")
  9. }

这部分代码说明case子句可以包含硬编码的变量,这种情况通常是switch`后跟有一个变量。

第四部分代码:

  1. var negative = regexp.MustCompile(`-`)
  2. var floatingPoint = regexp.MustCompile(`\d?\.\d`)
  3. var mail = regexp.MustCompile(`^[^@]+@[^@.]+\.[^@.]+`)
  4. switch {
  5. case negative.MatchString(asString):
  6. fmt.Println("Negative number")
  7. case floatingPoint.MatchString(asString):
  8. fmt.Println("Floating Point")
  9. case mail.MatchString(asString):
  10. fmt.Println("It is an email")
  11. fallthrough
  12. default:
  13. fmt.Println("Something else")
  14. }

这部分代码十分有趣。首先,我们定义了3个正则表达negative,floatingPoint,以及mail。然后使用regexp.MatchString()switch中匹配不同的情况。

最后,fallthrough关键字告诉Go执行接下来的分支,即default分支。这意味着无论mail.MatchString(asString)是否成功匹配,default子句都会执行。

最后一部分:

  1. var aType error = nil
  2. switch aType.(type) {
  3. case nil:
  4. fmt.Println("It is a nil interface")
  5. default:
  6. fmt.Println("It it not a nil interface")
  7. }
  8. }

这段代码说明switch能够区分不同类型,你将在第7章中了解到接口的知识。执行switch.go将会产生如下输出:

  1. $ go run switch.go
  2. Usage: switch number
  3. exit status 1
  4. hanshanjiedeMacBook-Pro:chapter4 hanshanjie$ go run switch.go mike@g.com
  5. The value is not an integer 0
  6. Do not care
  7. It is an email
  8. Something else
  9. It is a nil interface
  10. hanshanjiedeMacBook-Pro:chapter4 hanshanjie$ go run switch.go 5
  11. Bigger than zero
  12. Five
  13. Something else
  14. It is a nil interface
  15. hanshanjiedeMacBook-Pro:chapter4 hanshanjie$ go run switch.go 0
  16. Zero
  17. Zero
  18. Something else
  19. It is a nil interface
  20. hanshanjiedeMacBook-Pro:chapter4 hanshanjie$ go run switch.go 1.2
  21. The value is not an integer 0
  22. Do not care
  23. Floating Point
  24. It is a nil interface
  25. hanshanjiedeMacBook-Pro:chapter4 hanshanjie$ go run switch.go -1.5
  26. The value is not an integer 0
  27. Do not care
  28. Negative number
  29. It is a nil interface