文章目录
- switch
- switch匹配
- 字典
go语言教程:安装入门➡️for循环➡️数组、切片和指针
switch和map,一个是控制流,一个是数据结构,之所以把两个不同类型的知识点放在一起讲解,是因为二者有着极其相似的运行逻辑,很多时候用于解决相似的问题。
switch
switch是C语言中就有的关键字,可匹配判定条件,并执行相关代码。而在go语言中,switch的功能得到了强化,首先可以作为if...else
的替代品,示例如下
//switch.go
package main
import "fmt"
func getGrade(n int)string{
switch{
case n == 100: return "S"
case n >= 90 : return "A"
case n >= 80 : return "B"
case n >= 60 : return "C"
case n >= 50 : return "D"
default: return "E"
}
}
func main(){
fmt.Println("100分的等级是:", getGrade(100))
fmt.Println("85分的等级是:", getGrade(85))
fmt.Println("62分的等级是:", getGrade(62))
fmt.Println("45分的等级是:", getGrade(45))
}
运行结果如下
>go run switch.go
100分的等级是: S
85分的等级是: B
62分的等级是: C
45分的等级是: E
switch匹配
其次,Go语言也支持类似C语言的switch用法,即匹配输入内容,但在语法上更加简洁,无需在每个case后面添加break。
func switchTest(g string){
fmt.Printf("您考了%s,你", g)
switch g{
case "S": fmt.Println("牛逼!\n")
case "A": fmt.Println("优秀\n")
case "B": fmt.Println("良好\n")
case "C": fmt.Println("及格\n")
case "D":
fmt.Println("不及格\n" )
fallthrough
default:
fmt.Println("滚\n" )
}
}
func main(){
switchTest("S")
switchTest("D")
switchTest("E")
switchTest("A")
}
其中,fallthrough关键字表示,在执行完本条case之后,忽略匹配条件,继续执行下一条命令。所以,如果匹配了D,那么在输出不及格之后,还会输出一个“滚”字。运行结果如下
您考了S,你牛逼!
您考了D,你不及格
滚
您考了E,你滚
您考了A,你优秀
字典
map
如果不考虑falthrough和default这两个功能,那么switch…case的匹配过程是一对一的,大致遵循下表
S | A | B | C | D | E |
---|---|---|---|---|---|
牛逼 | 优秀 | 良好 | 及格 | 不及格 | 滚 |
而这张表,正体现出字典的键值对映射关系,在go语言中,map就是描述键值对映射的数据类型,而创建map的方法,与创建切片一样,也是通过make关键字,其声明方式如下,mp1通过字符串索引整型,mp2则通过字符串索引字符串。
mp1 := make(map[string]int)
mp2 := make(map[string]string)
下面用map来重新实现等级和说明的匹配逻辑
func mapTest(g string){
mp := map[string]string{
"S": "牛逼!", "A": "优秀",
"B": "良好", "C": "及格",
"D": "不及格",
"E": "滚",
}
fmt.Println(g, mp[g])
}
由于在创建时直接对map的内容初始化了,所以并不需要用到make。