8、GO语言入门-switch语句

1.switch语句:“开关”

  • switch是一个条件语句,它计算表达式并将其与可能匹配的列表进行比较,并根据匹配执行代码块。它可以被认为是一种惯用的方式来写多个if else子句。
  • switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止。switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break。而如果switch没有表达式,它会匹配true
  • Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch,但是可以使用fallthrough强制执行后面的case代码。
/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/3/29  19:47
 * @tags 喜欢就去努力的争取
 */
package main

import (
	"errors"
	"fmt"
)

func main() {

	// 语法结构
	/**
	switch var1 {
		case: val1:
		...
		case: val2:
		...
		default:
		...
	}
	*/

	fmt.Println("请输入一个数值:")

	var x int
	fmt.Scan(&x)
	num := x

	switch num {
	case 1:
		fmt.Printf("分支一:num的值为:%d,类型为:%T", num, num)
	case 2:
		fmt.Printf("分支二:num的值为:%d,类型为:%T", num, num)
	default:
		fmt.Printf("默认分支:num的值为:%d,类型为:%T", num, num)
	}

	fmt.Println("main 分支 执行结束......")
	// 小案例:模拟计算器
	fmt.Println("请输入第一个数:")
	var num1 int
	fmt.Scan(&num1)

	fmt.Println("请输入第二个数:")
	var num2 int
	fmt.Scan(&num2)

	fmt.Println("请选择计算方式(1-4):")
	println("1、\t+")
	println("2、\t-")
	println("3、\t*")
	println("4、\t/")
	println("5、\t%")

	// 定义计算方式
	var compute string

	var expr int
	fmt.Scan(&expr)

	switch expr {
	case 1:
		compute = "+"
	case 2:
		compute = "-"
	case 3:
		compute = "*"
	case 4:
		compute = "/"
	case 5:
		compute = "%"
	}

	var result int
	switch compute {
	case "+":
		result = num1 + num2
	case "-":
		result = num1 - num2
	case "*":
		result = num1 * num2
	case "/":
		result = num1 / num2
	case "%":
		result = num1 % num2
	default:
		errors.New("出错了~")
	}
	fmt.Printf("%d \t %s \t %d = %d", num1, compute, num2, result)
}

image

注意事项:

  • 1.switch可以作用在其他类型上,case后的数值必须和switch作用的变量类型一致
  • 2.case是无序的
  • 3.case后的数值是唯一的(duplicate case 3 in switch)
  • 4.default语句是可选的操作

2.一些变形写法

/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/3/29  21:01
 * @tags 喜欢就去努力的争取
 */
package main

import "fmt"

func main() {

	/**
	其他写法1 :省略switch后面的变量
	其他写法2 :case后面更多个值
	其他写法3 :switch后写一条初始化语句


	*/

	// 变形一
	switch {
	case true:
		fmt.Println("true")
	case false:
		fmt.Println("false")
	}
	/**
	成绩:
		0-59:E类,不及格
		60-69:D类,及格
		70-79:C类,中
		80-89:B类,良
		90-100:A类,优秀
	*/
	fmt.Println("请输入分数:")
	score := 0
	fmt.Scan(&score)
	switch {
	case score >= 0 && score < 60:
		fmt.Println("E类,不及格")
	case score >= 60 && score < 70:
		fmt.Println("D类,及格")
	case score >= 70 && score < 80:
		fmt.Println("C类,中")
	case score >= 80 && score < 90:
		fmt.Println("B类,良")
	case score >= 90 && score <= 100:
		fmt.Println("A类,优秀")
	default:
		fmt.Println("成绩有误~~~")
	}

	fmt.Println("-----------------------------")
	// 变形二 :多case值匹配

	fmt.Println("请输入音标:")
	letter := ""
	fmt.Scan(&letter)

	switch letter {
	case "A", "E", "I", "O", "U":
		fmt.Println(letter, "是元音")
	case "M", "N":
		fmt.Println("M或N")
	default:
		fmt.Println("其他")
	}

	// 小案例
	fmt.Println("请输入年份:")
	var year int
	fmt.Scan(&year)

	fmt.Println("请输入月份:")
	var mouth int
	fmt.Scan(&mouth)

	day := 0

	switch mouth {
	case 1, 3, 5, 7, 8, 10, 12:
		day = 31
	case 4, 6, 9, 11:
		day = 30
	case 2:
		if year%100 == 0 || year%4 == 0 && year%100 != 0 {
			day = 29
		} else {
			day = 2812
		}
	default:
		fmt.Println("输入的月份有误")
	}
	fmt.Println(mouth, "有", day, "天")

	// 变形三
	switch i := 1; i {
	case 1:
		fmt.Println("i的值为:", i)
	default:
		fmt.Println("其他...")
	}
	// fmt.Println(i) // 注意:作用域问题
}

3.break;fallthrough

break:
  • 可以使用在switch中,也可以使用在for循环中强制结束case语句,从而结束switch分支
fallthrough:
  • 用于穿透switch当switch中某个case匹配成功之后,就执行该case语句如果遇到fallthrough,那么后面紧邻的case,无需匹配,执行穿透执行。
  • fallthrough应该位于某个case的最后一行
/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/3/29  22:06
 * @tags 喜欢就去努力的争取
 */
package main

import "fmt"

func main() {

	n := 2
	switch n {
	case 1:
		fmt.Println("熊大")
		fmt.Println("熊大")
		fmt.Println("熊大")
		// 强制结束case
		break
		fmt.Println("熊大")
	case 2:
		fmt.Println("熊二")
		fmt.Println("熊二")
		fmt.Println("熊二")
		// 紧邻的case穿透,不像java语言中默认是穿透的
		fallthrough
	case 3:
		fmt.Println("光头强")
		fmt.Println("光头强")
		fallthrough
	case 4:
		fmt.Println("哈哈哈")
	default:
		fmt.Println("啥也不是~")
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
结合视频效果更好 https://www.bilibili.com/video/av81167448?p=189 1. 初识Go语言 1 1.1 Go语言介绍 1 1.1.1 Go语言是什么 1 1.1.2 Go语言优势 1 1.1.3 Go适合用来做什么 2 1.2 环境搭建 2 1.2.1 安装和设置 2 1.2.2 标准命令概述 2 1.2.3 学习资料 3 1.3 第一个Go程序 3 1.3.1 Hello Go 3 1.3.2 代码分析 3 1.3.3 命令行运行程序 4 2. 基础类型 4 2.1 命名 4 2.2 变量 5 2.2.1 变量声明 5 2.2.2 变量初始化 6 2.2.3 变量赋值 6 2.2.4 匿名变量 6 2.3 常量 7 2.3.1 字面常量(常量值) 7 2.3.2 常量定义 8 2.3.3 iota枚举 8 2.4 基础数据类型 10 2.4.1 分类 10 2.4.2 布尔类型 11 2.4.3 整型 11 2.4.4 浮点型 11 2.4.5 字符类型 11 2.4.6 字符串 12 2.4.7 复数类型 12 2.5 fmt包的格式化输出输入 13 2.5.1 格式说明 13 2.5.2 输出 14 2.5.3 输人 14 2.6 类型转换 15 2.7 类型别名 15 3. 运算符 15 3.1 算术运算符 15 3.2 关系运算符 16 3.3 逻辑运算符 16 3.4 位运算符 16 3.5 赋值运算符 17 3.6 其他运算符 17 3.7 运算符优先级 17 4. 流程控制 18 4.1 选择结构 18 4.1.1 if语句 18 4.1.2 switch语句 19 4.2 循环语句 20 4.2.1 for 20 4.2.2 range 20 4.3 跳转语句 21 4.3.1 break和continue 21 4.3.2 goto 21 5. 函数 22 5.1 定义格式 22 5.2 自定义函数 22 5.2.1 无参无返回值 22 5.2.2 有参无返回值 23 5.2.3 无参有返回值 24 5.2.4 有参有返回值 25 5.3 递归函数 26 5.4 函数类型 27 5.5 匿名函数与闭包 27 5.6 延迟调用defer 30 5.6.1 defer作用 30 5.6.2 多个defer执行顺序 30 5.6.3 defer和匿名函数结合使用 31 5.7 获取命令行参数 31 5.8 作用域 32 5.8.1 局部变量 32 5.8.2 全局变量 33 5.8.3 不同作用域同名变量 33 6. 工程管理 34 6.1 工作区 34 6.1.1 工作区介绍 34 6.1.2 GOPATH设置 35 6.2 包 35 6.2.1 自定义包 35 6.2.2 main包 36 6.2.3 main函数和init函数 36 6.2.4 导入包 38 6.3 测试案例 40 6.3.1 测试代码 40 6.3.2 GOPATH设置 42 6.3.3 编译运行程序 43 6.3.4 go install的使用 43 7. 复合类型 45 7.1 分类 45 7.2 指针 45 7.2.1 基本操作 45 7.2.2 new函数 46 7.2.3 指针做函数参数 46 7.3 数组 47 7.3.1 概述 47 7.3.2 操作数组 47 7.3.3 在函数间传递数组 48 7.4 slice 49 7.4.1 概述 49 7.4.2 切片的创建和初始化 49 7.4.3 切片的操作 50 7.4.4 切片做函数参数 52 7.5 map 53 7.5.1 概述 53 7.5.2 创建和初始化 53 7.5.3 常用操作 54 7.5.4 map做函数参数 55 7.6 结构体 56 7.6.1 结构体类型 56 7.6.2 结构体初始化 57 7.6.3 结构体成员的使用 57 7.6.4 结构体比较 58 7.6.5 结构体作为函数参数 59 7.6.6 可见性 59 8. 面向对象编程 61 8.1 概述 61 8.2 匿名组合 61 8.2.1 匿名字段 61 8.2.2 初始化 62 8.2.3 成员的操作 62 8.2.4 同名字段 63 8.2.5 其它匿名字段 64 8.3 方法 65 8.3.1 概述 65 8.3.2 为类型添加方法 66 8.3.3 值语义和引用语义 67 8.3.4
个人学习golang笔记,从各种教程中总结而来,作为入门参考。目录如下 目录 1. 入门 1 1.1. Hello world 1 1.2. 命令行参数 2 2. 程序结构 3 2.1. 类型 4 2.1.1. 命名类型(named type)与未命名类型(unamed type) 4 2.1.2. 基础类型(underlying type) 4 2.1.3. 可赋值性 5 2.1.4. 类型方法集 6 2.1.5. 类型声明 6 2.2. 变量 8 2.2.1. 变量声明 8 2.2.2. 类型零值 12 2.2.3. 指针 13 2.3. 赋值 17 2.4. 包和文件 17 2.5. 作用域 18 2.6. 语句 19 2.7. 比较运算符 20 2.8. 类型转换 21 2.9. 控制流 23 2.9.1. If 23 2.9.2. Goto 24 2.9.3. For 25 2.9.4. Switch 25 2.9.5. break语句 31 2.9.6. Continue语句 31 3. 基础数据类型 31 3.1. golang类型 31 3.2. Numeric types 32 3.3. 字符串 33 3.3.1. 什么是字符串 33 3.3.2. 字符串底层概念 35 3.3.3. 获取每个字节 38 3.3.4. Rune 39 3.3.5. 字符串的 for range 循环 40 3.3.6. 用字节切片构造字符串 41 3.3.7. 用rune切片构造字符串 42 3.3.8. 字符串的长度 42 3.3.9. 字符串是不可变的 42 3.3.10. UTF8(go圣经) 43 3.4. 常量 45 3.4.1. 常量定义 45 3.4.2. 常量类型 46 3.4.3. Iota 46 4. 组合数据类型 47 4.1. 数组 47 4.1.1. 数组概述 47 4.1.2. 数组的声明 49 4.1.3. 数组的长度 50 4.1.4. 遍历数组 50 4.1.5. 多维数组 51 4.2. 切片 52 4.2.1. 什么是切片 52 4.2.2. 切片概述 55 4.2.3. 创建一个切片 55 4.2.4. 切片遍历 57 4.2.5. 切片的修改 58 4.2.6. 切片的长度和容量 60 4.2.7. 追加切片元素 62 4.2.8. 切片的函数传递 65 4.2.9. 多维切片 66 4.2.10. 内存优化 67 4.2.11. nil slice和empty slice 69 4.2.12. For range 70 4.3. 结构 71 4.3.1. 什么是结构体? 71 4.3.2. 结构体声明 73 4.3.3. 结构体初始化 77 4.3.4. 嵌套结构体(Nested Structs) 81 4.3.5. 匿名字段 82 4.3.6. 导出结构体和字段 84 4.3.7. 结构体相等性(Structs Equality) 85 4.4. 指针类型 86 4.5. 函数 87 4.6. map 87 4.6.1. 什么是map 87 4.6.2. 声明、初始化和make 89 4.6.3. 给 map 添加元素 91 4.6.4. 获取 map 中的元素 91 4.6.5. 删除 map 中的元素 92 4.6.6. 获取 map 的长度 92 4.6.7. Map 的相等性 92 4.6.8. map的排序 92 4.7. 接口 93 4.7.1. 什么是接口? 93 4.7.2. 接口的声明与实现 96 4.7.3. 接口的实际用途 97 4.7.4. 接口的内部表示 99 4.7.5. 空接口 102 4.7.6. 类型断言 105 4.7.7. 类型选择(Type Switch) 109 4.7.8. 实现接口:指针接受者与值接受者 112 4.7.9. 实现多个接口 114 4.7.10. 接口的嵌套 116 4.7.11. 接口的零值 119 4.8. Channel 120 4.9. 类型转换 120 5. 函数 120 5.1. 函数的声明 121 5.2. 一个递归函数的例子( recursive functions) 121 5.3. 多返回值 121 5.4. 命名返回值 121 5.5. 可变函数参数 122 5.6. Defer 123 5.6.1. Defer语句介绍 123 5.6.2. Defer使用场景 128 5.7. 什么是头等(第一类)函数? 130 5.8. 匿名函数 130 5.9. 用户自定义的函数类型 132 5.10. 高阶函数(装饰器?) 133 5.10.1. 把函数作为参数,传递给其它函数 134 5.10.2. 在其它函数中返回函数 134 5.11. 闭包 135 5.12. 头等函数的实际用途 137 6. 微服务创建 140 6.1. 使用net/http创建简单的web server 140 6.2. 读写JSON 144 6.2.1. Marshal go结构到JSON 144 6.2.2. Unmarshalling JSON 到Go结构 146 7. 方法 146 7.1. 什么是方法? 146 7.2. 方法示例 146 7.3. 函数和方法区别 148 7.4. 指针接收器与值接收器 153 7.5. 那么什么时候使用指针接收器,什么时候使用值接收器? 155 7.6. 匿名字段的方法 156 7.7. 在方法中使用值接收器 与 在函数中使用值参数 157 7.8. 在方法中使用指针接收器 与 在函数中使用指针参数 159 7.9. 在非结构体上的方法 161 8. 并发入门 162 8.1. 并发是什么? 162 8.2. 并行是什么? 162 8.3. 从技术上看并发和并行 163 8.4. Go 对并发的支持 164 9. Go 协程 164 9.1. Go 协程是什么? 164 9.2. Go 协程相比于线程的优势 164 9.3. 如何启动一个 Go 协程? 165 9.4. 启动多个 Go 协程 167 10. 信道channel 169 10.1. 什么是信道? 169 10.2. 信道的声明 169 10.3. 通过信道进行发送和接收 169 10.4. 发送与接收默认是阻塞的 170 10.5. 信道的代码示例 170 10.6. 信道的另一个示例 173 10.7. 死锁 174 10.8. 单向信道 175 10.9. 关闭信道和使用 for range 遍历信道 176 11. 缓冲信道和工作池(Buffered Channels and Worker Pools) 179 11.1. 什么是缓冲信道? 179 11.2. 死锁 182 11.3. 长度 vs 容量 183 11.4. WaitGroup 184 11.5. 工作池的实现 186 12. Select 188 12.1. 什么是 select? 188 12.2. 示例 189 12.3. select 的应用 190 12.4. 默认情况 190 12.5. 死锁与默认情况 191 12.6. 随机选取 191 12.7. 这下我懂了:空 select 191 13. 文件读写 191 13.1. GoLang几种读文件方式的比较 197 14. 个人 197 14.1. ++,-- 198 14.2. 逗号 198 14.3. 未使用的变量 199 14.4. Effective go 199 14.4.1. 指针 vs. 值 199 14.5. 可寻址性-map和slice的区别 201 14.5.1. slice 201 14.5.2. map 202 14.6. golang库 203 14.6.1. unicode/utf8包 203 14.6.2. time包 205 14.6.3. Strings包 205 14.6.4. 输入输出 212 14.6.5. 正则处理 224 14.6.6. Golang内建函数 226

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值