switch语句
在本节介绍switch
语句主要是因为switch
可以用于正则表达式!首先看一段switch
代码块:
switch asString {
case "1":
fmt.Println("One")
case "0":
fmt.Println("Zero")
default:
fmt.Println("Do not care!")
}
这段代码能够区分不同的asString
值所对应的不同操作。
switch
代码块设置default子句是非常棒的实践。由于switch
的case
语句是依赖顺序的,所以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部分展示。
第一部分:
package main
import (
"fmt"
"os"
"regexp"
"strconv"
)
func main() {
arguments := os.Args
if len(arguments) <2 {
fmt.Println("Usage: switch number")
os.Exit(1)
}
regex
包用于生成正则表达。
第二部分代码:
number, err := strconv.Atoi(arguments[1])
if err != nil {
fmt.Println("The value is not an integer",number)
}else {
switch {
case number<0:
fmt.Println("Less than zero")
case number >0:
fmt.Println("Bigger than zero")
default:
fmt.Println("Zero")
}
}
第三部分代码:
asString := arguments[1]
switch asString{
case "5":
fmt.Println("Five")
case "0":
fmt.Println("Zero")
default:
fmt.Println("Do not care")
}
这部分代码说明case子句可以包含硬编码的变量,这种情况通常是
switch`后跟有一个变量。
第四部分代码:
var negative = regexp.MustCompile(`-`)
var floatingPoint = regexp.MustCompile(`\d?\.\d`)
var mail = regexp.MustCompile(`^[^@]+@[^@.]+\.[^@.]+`)
switch {
case negative.MatchString(asString):
fmt.Println("Negative number")
case floatingPoint.MatchString(asString):
fmt.Println("Floating Point")
case mail.MatchString(asString):
fmt.Println("It is an email")
fallthrough
default:
fmt.Println("Something else")
}
这部分代码十分有趣。首先,我们定义了3个正则表达negative
,floatingPoint
,以及mail
。然后使用regexp.MatchString()
在switch
中匹配不同的情况。
最后,fallthrough
关键字告诉Go执行接下来的分支,即default
分支。这意味着无论mail.MatchString(asString)
是否成功匹配,default
子句都会执行。
最后一部分:
var aType error = nil
switch aType.(type) {
case nil:
fmt.Println("It is a nil interface")
default:
fmt.Println("It it not a nil interface")
}
}
这段代码说明switch
能够区分不同类型,你将在第7章中了解到接口的知识。执行switch.go
将会产生如下输出:
$ go run switch.go
Usage: switch number
exit status 1
hanshanjiedeMacBook-Pro:chapter4 hanshanjie$ go run switch.go mike@g.com
The value is not an integer 0
Do not care
It is an email
Something else
It is a nil interface
hanshanjiedeMacBook-Pro:chapter4 hanshanjie$ go run switch.go 5
Bigger than zero
Five
Something else
It is a nil interface
hanshanjiedeMacBook-Pro:chapter4 hanshanjie$ go run switch.go 0
Zero
Zero
Something else
It is a nil interface
hanshanjiedeMacBook-Pro:chapter4 hanshanjie$ go run switch.go 1.2
The value is not an integer 0
Do not care
Floating Point
It is a nil interface
hanshanjiedeMacBook-Pro:chapter4 hanshanjie$ go run switch.go -1.5
The value is not an integer 0
Do not care
Negative number
It is a nil interface