go语言学习笔记 — 基础 — 控制流:switch分支选择语句
Posted Locutus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 基础 — 控制流:switch分支选择语句相关的知识,希望对你有一定的参考价值。
switch分支选择语句的特点
- 可以使用任何类型或表达式作为条件语句
- 基于不同条件执行不同的动作,每一个case分支都是唯一的,从上到下逐一测试,直到匹配为止(默认只会执行一个case)
- 每一个case后面也不需要再加break
- 可理解为一种批量if语句,可方便地判断大量的值,不仅可以判断常量,还可以判断表达式。C/C++语言中的switch语句只支持数值常量,不能对字符串、表达式等复杂情况进行处理
- 左大括号必须和条件语句在同一行
- 最多有一个default分支
基本写法
在go中,switch语句的case与case之间是独立代码块,不需要通过break语句跳出当前case块,以避免执行到下一行。格式如下:
switch var {
case var1表达式1:
...
case var1表达式2:
...
default:
...
}
变量var1可以是任何类型,而var1表达式1和var1表达式2则可以是变量var1的任意取值。变量类型不局限于常量或表达式,但必须是相同类型。你可以同时测试多个可能符合条件的值,使用逗号分隔它们,例如:case var1表达式1, var1表达式2, var1表达式3。流程如下:
- switch语句最多有一个default分支
下面的每一个case语句均是字符串格式,且使用了default分支,Go语言规定每个switch语句最多只能有一个default分支。
var a = "hello"
switch a {
case "hello":
fmt.Println(1)
case "world":
fmt.Println(2)
default:
fmt.Println(O)
}
- 一分支多值
当多个case语句写在一起时,不同的var表达式之间使用逗号分隔,可以像下面一样:
var a = "num"
switch a {
case "num", "daddy":
fmt.Println("family")
}
- 分支表达式
case后不仅仅只跟常量,还可以与if一样跟条件表达式
var r int = 11
switch {
case r > 10 && r < 20:
fmt.Println(r)
}
这种情况,连判断的目标都没有,switch后面不再跟判断变量。
实例
- 判断成绩等级
package main
import "fmt"
func main() {
// 定义局部变量
var grade string
var marks int
fmt.Println("输入一个数字:")
fmt.Scan(&marks) // 从命令行获取一个数字,赋给变量marks
switch {
case marks >= 90:
grade = "A"
case marks < 90 && marks >= 80:
grade = "B"
case marks < 80 && marks >= 70:
grade = "C"
case marks < 70 && marks >= 60:
grade = "D"
default:
grade = "E"
}
switch {
case grade == "A":
fmt.Printf("优秀!\\n")
case grade == "B":
fmt.Printf("良好\\n")
case grade == "C":
fmt.Printf("中等\\n")
case grade == "D":
fmt.Printf("及格\\n")
default:
fmt.Printf("不及格\\n")
}
fmt.Printf("你的等级是 %s\\n", grade)
}
- Type Switch
switch语句还可以被用于type-switch,以判断某个空接口变量interface{}中实际存储的变量类型。语法如下:
switch x.(type) {
case type1:
statement(s)
case type2:
statement(s)
// 你可以定义任意个数的case
default:
statement(s)
}
实例:判断某个空接口变量interface{}中实际存储的变量类型
package main
import (
"fmt"
"testing"
)
func main() {
var x interface{}
// switch之后可以有变量初始化语句
switch i := x.(type) {
// 当i的类型是以下各种情况时
case nil:
fmt.Printf(" x 的类型 :%T", i)
case int:
fmt.Printf("x 是 int 型")
case float64:
fmt.Printf("x 是 float64 型")
case func(int) float64:
fmt.Printf("x 是 func(int) 型")
case bool, string:
fmt.Printf("x 是 bool 或 string 型")
default:
fmt.Printf("未知型")
}
}
tips
- 支持多条件匹配
switch{
case 1, 2, 3, 4:
...
default:
...
}
- 在条件中,支持一个初始化表达式(可以是并行方式),右侧需跟分号
- 如果条件满足,但是仍希望继续执行下一个case,需使用fallthrough语句,也可用break终止
switch{
case 1:
...
if (...) {
break
}
fallthrough //此时switch会执行case1和case2,但是如果if条件满足,则只执行case1
case 2:
...
case 3:
...
}
以上是关于go语言学习笔记 — 基础 — 控制流:switch分支选择语句的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 基础 — 控制流:if条件(分支)语句