1.4 Go语言-switch语句(转)
与串联的if
语句类似,switch
语句提供了一个多分支条件执行的方法。不过在这里用一个专有名词来代表分支——case
。每一个case
可以携带一个表达式或一个类型说明符。前者又可被简称为case
表达式。因此,Go语言的switch
语句又分为表达式switch
语句和类型switch
语句。
先说表达式switch
语句。在此类switch
语句中,每个case
会携带一个表达式。与if
语句中的条件表达式不同,这里的case
表达式的结果类型并不一定是bool
。不过,它们的结果类型需要与switch
表达式的结果类型一致。所谓switch
表达式是指switch
语句中要被判定的那个表达式。switch
语句会依据该表达式的结果与各个case
表达式的结果是否相同来决定执行哪个分支。请看下面的示例:
var name string
// 省略若干条语句
switch name {
case "Golang":
fmt.Println("A programming language from Google.")
case "Rust":
fmt.Println("A programming language from Mozilla.")
default:
fmt.Println("Unknown!")
}
可以看到,在上述switch
语句中,name
充当了switch
表达式,而"Go"
和"Rust"
充当了case
表达式。它们的结果类型是一致的,都是string
。顺便说一句,可以有只包含一个字面量或标识符的表达式。它们是最简单的表达式,属于基本表达式的一种。
请大家注意switch
语句的写法。switch
表达式必须紧随switch
关键字出现。在后面的花括号中,一个关键字case
、case
表达式、冒号以及后跟的若干条语句组成为一条case
语句。在switch
语句中可以有若干条case
语句。Go语言会依照从上至下的顺序对每一条case
语句中case
表达式进行求值。只要被发现其表达式与switch
表达式的结果相同,该case
语句就会被选中。它包含的那些语句就会被执行。而其余的case
语句则会被忽略。
switch
语句中还可以存在一个特殊的case
——default case
。顾名思义,当没有一个常规的case
被选中的时候,default
case
就会被选中。上面示例中就存在一个default case
。它由关键字default
、冒号和后跟的一条语句组成。实际上,default case
不一定被追加在最后。它可以是第一个case
,或者出现在任意顺位上。
另外,与if
语句一样,switch
语句还可以包含初始化子句,且其出现位置和写法也如出一辙。如:
names := []string{"Golang", "Java", "Rust", "C"}
switch name := names[]; name {
case "Golang":
fmt.Println("A programming language from Google.")
case "Rust":
fmt.Println("A programming language from Mozilla.")
default:
fmt.Println("Unknown!")
}
好了,我们已经对switch
语句的一般形式——表达式switch
语句——有所了解了。下面我们来说说类型switch
语句。它与一般形式有两点差别。第一点,紧随case
关键字的不是表达式,而是类型说明符。类型说明符由若干个类型字面量组成,且多个类型字面量之间由英文逗号分隔。第二点,它的switch
表达式是非常特殊的。这种特殊的表达式也起到了类型断言的作用,但其表现形式很特殊,如:v.(type)
,其中v
必须代表一个接口类型的值。注意,该类表达式只能出现在类型switch
语句中,且只能充当switch
表达式。一个类型switch
语句的示例如下:
v :=
switch i := interface{}(v).(type) {
case int, int8, int16, int32, int64:
fmt.Printf("A signed integer: %d. The type is %T. \n", i, i)
case uint, uint8, uint16, uint32, uint64:
fmt.Printf("A unsigned integer: %d. The type is %T. \n", i, i)
default:
fmt.Println("Unknown!")
}
请注意,我们在这里把switch
表达式的结果赋给了一个变量。如此一来,我们就可以在该switch
语句中使用这个结果了。这段代码被执行后,标准输出上会打印出A signed integer: 11. The type is int.
。
最后,我们来说一下fallthrough
。它既是一个关键字,又可以代表一条语句。fallthrough
语句可被包含在表达式switch
语句中的case
语句中。它的作用是使控制权流转到下一个case
。不过要注意,fallthrough
语句仅能作为case
语句中的最后一条语句出现。并且,包含它的case
语句不能是其所属switch
语句的最后一条case
语句。
1.4 Go语言-switch语句(转)的更多相关文章
- R语言Switch语句
R语言Switch语句 switch语句允许一个变量值的列表来平等进行测试.每个值被称为一个条件(情况),变量被接通检查每个条件(情况). 语法 在R语言中创建switch语句的基本语法是: 以下规则 ...
- C语言switch语句
C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况.例如,输入一个整数,输出该整数对应的星期几的英 ...
- C语言-switch语句的使用。对文件的输出处理。for循环和if的结合使用。
//函数fun功能:统计字符串中各元音字母的个数,注意:不区分大小写. //重难点:switch语句的使用. #include <stdlib.h> #include <conio. ...
- PROCESS_YIELD()宏和C语言的switch语句< contiki学习笔记之七>
写在前面: 按照main()函数的代码一行一行的分析,该是看到了 etimer_process 这个位置.但是etimer_process实现里的一个宏 PROCESS_YIELD()引出了很多故事 ...
- go语言基础之switch语句 和 fallthrough 用途
Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码: 示例1 ...
- go语言之if语句和switch语句和循环语句
1.if语句 package main import ( "fmt" "io/ioutil" ) func main() { //流程控制 //使用常量定义一个 ...
- 【C语言】-条件语句-switch语句
switch语句: 用于直接处理不同情况下的多路问题. switch语句又可称为开关语句,其执行流程和多分支if语句类似. switch (表达式) { case 常量表达式1:语句组1;break; ...
- C语言-switch语句
switch (表达式的值) { case 1: 语句1 break; case 2: 语句2 break; case 3: 语句3 break; case 4: 语句4 break; ...... ...
- C语言switch中case后跟随break语句
1.case后面的常量表达式实际上只起语句标号作用,而不起条件判断作用,即“只是开始执行处的入口标号”.因此,一旦与switch后面圆括号中表达式的值匹配,就从此标号处开始执行:而且执行完一个case ...
随机推荐
- 算法Sedgewick第四版-第1章基础-023-MultiwordSearch.java
Multi-word search. Program MultiwordSearch.java reads a sequence of query words q[1], ..., q[k] from ...
- ARC073D Simple Knapsack
传送门 题目大意 给你n个物品,你有一个容量为W的背包,每一个物品都有它的重量和价值,让你从n个中选取若干个,使得总重量不超过背包的上限,而且使得价值最大. 分析 首先我们不难发现由于W很大,所以这并 ...
- Luogu 3822 [NOI2017]整数
看懂了的大佬的题解.(这个id太巨了,找不到他的blog) 考虑直接暴力算进位均摊复杂度是对的,证明戳这里. 但是题目要求我们支持一个减操作,这就相当于返回之前操作前的结果,这对于这种均摊的复杂度的东 ...
- 使用Spring加载properties配置文件.md
背景 类似于datasource.properties之类的配置文件,最初通过Java的Properties类进行处理.这种方式有许多弊端,如每次都需要读取配置文件:若将Properties作为成员变 ...
- Oracle数据库网闸配置注意事项
1.数据库用户需要的权限 grant select any dictionary to coss; grant alter any procedure to coss; grant create tr ...
- Git相关安装包打包下载
Git相关软件偶尔需要***才能下载,故分享于此 1.Git-2.15.0-64-bit.exe 2.TortoiseGit-2.5.0.0-64bit.msi 3.TortoiseGit-Langu ...
- wget下载jdk 蛋疼问题
wget --no-check-certificate --no-cookies --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com% ...
- SQLite 如何清空表数据并将递增量归零
SQLite并不支持TRUNCATE TABLE语句 方式一: DELETE FROM [Tab_User] --不能将递增数归零 方式二: DELETE FROM sqlite_sequence W ...
- MVC Controller传值到View的几种方式总结
Controller中的代码如下 var bingo = new Web1.Models.Bingo() { Title = "测试", desc = "嘻嘻" ...
- 记一次成功部署kolla-ansible ocata版本过程
1.安装的docker版本 [root@controller ~]# docker --versionDocker version 17.09.1-ce, build 19e2cf6 2.安装的ans ...