Golang学习笔记_10——Switch

news/2024/12/17 20:28:40/

Golang学习笔记_07——基本类型
Golang学习笔记_08——For循环
Golang学习笔记_09——if条件判断


文章目录

    • Switch语句
      • 1. 基本用法
      • 2. 多个表达式匹配同一个case
      • 3. 不带表达式的switch(相当于`if-else if-else`)
        • 4. 使用`fallthrough`关键字
      • 5. Type Switch(类型开关)
      • 6. 注意事项
    • 源码


Switch语句

1. 基本用法

在Go语言中,switch语句是一种多分支选择结构,用于替代多个if-else语句,使代码更加简洁和易读。switch语句可以基于一个或多个表达式进行匹配,并执行相应的代码块。

switch expr {
case value1:// 当 expr == value1 时执行的代码
case value2:// 当 expr == value2 时执行的代码
default:// 当 expr 不匹配任何 case 时执行的代码
}
  • expr:要评估的表达式。
  • case valueN:与expr进行比较的值。
  • default:可选的默认分支,当expr不匹配任何case时执行。

举个例子

func switchDemo(inputNum int) {num := inputNumswitch num {case 1:fmt.Println("One")case 2:fmt.Println("Two")case 3:fmt.Println("Three")default:fmt.Println("Other")}
}

测试方法

func Test_switchDemo(t *testing.T) {type args struct {inputNum int}tests := []struct {name stringargs args}{{name: "1",args: args{inputNum: 1},},{name: "other",args: args{inputNum: 100},},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {switchDemo(tt.args.inputNum)})}
}

输出结果

=== RUN   Test_switchDemo
=== RUN   Test_switchDemo/1
One
=== RUN   Test_switchDemo/other
Other
--- PASS: Test_switchDemo (0.00s)--- PASS: Test_switchDemo/1 (0.00s)--- PASS: Test_switchDemo/other (0.00s)
PASS

2. 多个表达式匹配同一个case

举个例子

func mutSwitchDemo(aChar byte) {switch aChar {case 'a', 'e', 'i', 'o', 'u':fmt.Println("Vowel")default:fmt.Println("Consonant")}
}

测试方法

func Test_mutSwitchDemo(t *testing.T) {type args struct {aChar byte}tests := []struct {name stringargs args}{{name: "a",args: args{aChar: 'a'},},{name: "z",args: args{aChar: 'z'},},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {mutSwitchDemo(tt.args.aChar)})}
}

输出结果

=== RUN   Test_mutSwitchDemo
=== RUN   Test_mutSwitchDemo/a
Vowel
=== RUN   Test_mutSwitchDemo/z
Consonant
--- PASS: Test_mutSwitchDemo (0.00s)--- PASS: Test_mutSwitchDemo/a (0.00s)--- PASS: Test_mutSwitchDemo/z (0.00s)
PASS

switchifelse_ifelse_151">3. 不带表达式的switch(相当于if-else if-else

举个例子

func noSwitchDemo(inputNum int) {num := inputNumswitch {case num < 0:fmt.Println("Negative")case num == 0:fmt.Println("Zero")case num > 0:fmt.Println("Positive")}
}

测试方法

func Test_noSwitchDemo(t *testing.T) {type args struct {inputNum int}tests := []struct {name stringargs args}{{name: "Negative",args: args{inputNum: -100},},{name: "zero",args: args{inputNum: 0},},{name: "Positive",args: args{inputNum: 100},},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {noSwitchDemo(tt.args.inputNum)})}
}

输出结果

=== RUN   Test_noSwitchDemo
=== RUN   Test_noSwitchDemo/Negative
Negative
=== RUN   Test_noSwitchDemo/zero
Zero
=== RUN   Test_noSwitchDemo/Positive
Positive
--- PASS: Test_noSwitchDemo (0.00s)--- PASS: Test_noSwitchDemo/Negative (0.00s)--- PASS: Test_noSwitchDemo/zero (0.00s)--- PASS: Test_noSwitchDemo/Positive (0.00s)
PASS
4. 使用fallthrough关键字

fallthrough关键字会使程序继续执行下一个case语句,即使当前case已经匹配成功。

func fullThroughDemo(inputNum int) {num := inputNumswitch num {case 1:fmt.Println("One")fallthroughcase 2:fmt.Println("Two (fallthrough)")case 3:fmt.Println("Three")default:fmt.Println("Other")}
}

测试方法

func Test_fullThroughDemo(t *testing.T) {type args struct {inputNum int}tests := []struct {name stringargs args}{{name: "1",args: args{inputNum: 1},},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {fullThroughDemo(tt.args.inputNum)})}
}

输出结果

=== RUN   Test_fullThroughDemo
=== RUN   Test_fullThroughDemo/1
One
Two (fallthrough)
--- PASS: Test_fullThroughDemo (0.00s)--- PASS: Test_fullThroughDemo/1 (0.00s)
PASS

5. Type Switch(类型开关)

举个例子

func typeSwitchDemo(i interface{}) {switch v := i.(type) {case int:fmt.Printf("Type is int: %d\n", v)case string:fmt.Printf("Type is string: %s\n", v)case bool:fmt.Printf("Type is bool: %t\n", v)default:fmt.Println("Unknown type")}
}

测试方法

func Test_typeSwitchDemo(t *testing.T) {type args struct {i interface{}}tests := []struct {name stringargs args}{{name: "bool",args: args{i: true},},{name: "int",args: args{i: 1},},{name: "string",args: args{i: "hello"},},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {typeSwitchDemo(tt.args.i)})}
}

输出结果

=== RUN   Test_typeSwitchDemo
=== RUN   Test_typeSwitchDemo/bool
Type is bool: true
=== RUN   Test_typeSwitchDemo/int
Type is int: 1
=== RUN   Test_typeSwitchDemo/string
Type is string: hello
--- PASS: Test_typeSwitchDemo (0.00s)--- PASS: Test_typeSwitchDemo/bool (0.00s)--- PASS: Test_typeSwitchDemo/int (0.00s)--- PASS: Test_typeSwitchDemo/string (0.00s)
PASS

6. 注意事项

  1. switchcase 语句从上到下顺次执行,直到匹配成功时停止。
  2. 每个case块以break隐式结束:在Go语言中,每个case块在执行完毕后会自动跳出switch语句,因此不需要显式地使用break
  3. fallthrough的使用fallthrough关键字是可选的,并且通常不常用,因为它会使代码的逻辑变得复杂。
  4. 类型开关:类型开关是Go语言特有的功能,非常适用于处理接口类型的变量。

源码

// switch_demo.go 文件
package switch_demoimport "fmt"func switchDemo(inputNum int) {num := inputNumswitch num {case 1:fmt.Println("One")case 2:fmt.Println("Two")case 3:fmt.Println("Three")default:fmt.Println("Other")}
}func mutSwitchDemo(aChar byte) {switch aChar {case 'a', 'e', 'i', 'o', 'u':fmt.Println("Vowel")default:fmt.Println("Consonant")}
}func noSwitchDemo(inputNum int) {num := inputNumswitch {case num < 0:fmt.Println("Negative")case num == 0:fmt.Println("Zero")case num > 0:fmt.Println("Positive")}
}func fullThroughDemo(inputNum int) {num := inputNumswitch num {case 1:fmt.Println("One")fallthroughcase 2:fmt.Println("Two (fallthrough)")case 3:fmt.Println("Three")default:fmt.Println("Other")}
}func typeSwitchDemo(i interface{}) {switch v := i.(type) {case int:fmt.Printf("Type is int: %d\n", v)case string:fmt.Printf("Type is string: %s\n", v)case bool:fmt.Printf("Type is bool: %t\n", v)default:fmt.Println("Unknown type")}
}
// switch_demo_test.go
package switch_demoimport ("testing"
)func Test_switchDemo(t *testing.T) {type args struct {inputNum int}tests := []struct {name stringargs args}{{name: "1",args: args{inputNum: 1},},{name: "other",args: args{inputNum: 100},},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {switchDemo(tt.args.inputNum)})}
}func Test_mutSwitchDemo(t *testing.T) {type args struct {aChar byte}tests := []struct {name stringargs args}{{name: "a",args: args{aChar: 'a'},},{name: "z",args: args{aChar: 'z'},},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {mutSwitchDemo(tt.args.aChar)})}
}func Test_noSwitchDemo(t *testing.T) {type args struct {inputNum int}tests := []struct {name stringargs args}{{name: "Negative",args: args{inputNum: -100},},{name: "zero",args: args{inputNum: 0},},{name: "Positive",args: args{inputNum: 100},},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {noSwitchDemo(tt.args.inputNum)})}
}func Test_fullThroughDemo(t *testing.T) {type args struct {inputNum int}tests := []struct {name stringargs args}{{name: "1",args: args{inputNum: 1},},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {fullThroughDemo(tt.args.inputNum)})}
}func Test_typeSwitchDemo(t *testing.T) {type args struct {i interface{}}tests := []struct {name stringargs args}{{name: "bool",args: args{i: true},},{name: "int",args: args{i: 1},},{name: "string",args: args{i: "hello"},},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {typeSwitchDemo(tt.args.i)})}
}

http://www.ppmy.cn/news/1555948.html

相关文章

【保姆级】Mac如何安装+切换Java环境

本文从如何下载不同版本的JDK,到如何丝滑的切换JDK,以及常见坑坑的处理方法,应有尽有,各位看官走过路过不要错过~~~ 下载⏬ 首先上官网: https://www.oracle.com/ 打不开的话可以使用下面👇这个中文的 https://www.oracle.com/cn/java/technologies/downloads/a…

第六章:反射+设计模式

一、反射 1. 反射 (Reflection) &#xff1a;允许在程序运行状态中&#xff0c;可以获取任意类中的属性和方法&#xff0c;并且可以操作任 意对象内部的属性和方法&#xff0c;这种动态获取类的信息及动态操作对象的属性和方法对应的机制称为 反射机制。 2. 类对象…

〔 MySQL 〕 C接口使用

一、准备工作 确保MySQL服务运行正常下载Connector/C库 二、库文件结构 include目录lib目录 三、验证库文件 示例代码编译命令 四、环境变量设置 五、MySQL接口介绍 初始化MySQL连接数据库 设置默认字符集 发送MySQL命令获取执行结果 获取结果行数获取结果列数获取列名…

爬虫学习案例4

爬取猪八戒网站数据&#xff1a;2024-12-12 使用xpath解析元素&#xff0c;安装依赖库 pip install lxml使用selenium步骤我的上篇博客有提到&#xff0c;这里就不重复了 selenium使用博客导航 # 安装pip install lxml,使用xpath from lxml import etree import time from s…

Redis Java 集成到 Spring Boot

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Redis &#x1f4da;本系列文章为个人学习笔…

信息化基础知识——电子商务(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 电子商务 大数…

记一次mysql字符集编码问题导致查询时间过长问题

数据表 rm_ic.audit_summary_2024_05_20 该表大概有1200w数据&#xff0c;有个字段为ids 不是唯一的&#xff0c;已建索引 audit_ids_idx create table rm_ic.test1 ( id varchar(19) primary key not null comment id, create_time datetime default CURRENT_TIMESTAMP ); cre…

ReactPress最佳实践—搭建导航网站实战

Github项目地址&#xff1a;https://github.com/fecommunity/easy-blog 欢迎Star。 近期&#xff0c;阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress&#xff0c;ReactPress一个基于 Next.js 的博客和 CMS 系统&#xff0c;可查看 demo站点。&#xff08;…