8、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)
}
注意事项:
- 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("啥也不是~")
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2022-03-29 异常:Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.qbb.srb.core.mapper.DictMapper.batchInsert
2022-03-29 RabbitMQ入门到进阶