Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
21492 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

20|控制结构:Go中的switch语句有哪些变化?

验证switch语句的简洁性
总结switch语句的特点和优势
解决方法:使用带label的break语句
问题示例:switch语句中的break未跳出外层for循环
示例:使用type switch获取动态类型对应的值信息
示例:使用type switch获取动态类型信息
特殊的switch语句用法
取消了默认执行下一个case代码逻辑的语义
case语句支持表达式列表
支持声明临时变量
支持各种类型值的表达式
Go语言中switch语句的灵活性
switch语句的执行流程
switch语句的一般形式
示例:readByExtBySwitch函数使用switch语句进行分支控制
示例:readByExt函数使用if语句进行分支控制
理论上已具备实现任何算法的能力
通过顺序、分支和循环这三种基本的控制结构构造算法
思考题
小结
跳不出循环的break
type switch
switch语句的灵活性
认识switch语句
介绍
控制结构:Go中的switch语句有哪些变化?

该思维导图由 AI 生成,仅供参考

你好,我是 Tony Bai。
经过前两节课的学习,我们已经掌握了控制结构中的分支结构以及循环结构。前面我们也提到过,在计算机世界中,再复杂的算法都可以通过顺序、分支和循环这三种基本的控制结构构造出来。所以,理论上讲,我们现在已经具备了实现任何算法的能力了。
不过理论归理论,我们还是要回到现实中来,继续学习 Go 语言中的控制结构,现在我们还差一种分支控制结构没讲。除了 if 语句之外,Go 语言还提供了一种更适合多路分支执行的分支控制结构,也就是 switch 语句
今天这一节课,我们就来系统学习一下 switch 语句。Go 语言中的 switch 语句继承自它的先祖 C 语言,所以我们这一讲的重点是 Go switch 语句相较于 C 语言的 switch,有哪些重要的改进与创新。
在讲解改进与创新之前,我们先来认识一下 switch 语句。

认识 switch 语句

我们先通过一个例子来直观地感受一下 switch 语句的优点。在一些执行分支较多的场景下,使用 switch 分支控制语句可以让代码更简洁,可读性更好。
比如下面例子中的 readByExt 函数会根据传入的文件扩展名输出不同的日志,它使用了 if 语句进行分支控制:
func readByExt(ext string) {
if ext == "json" {
println("read json file")
} else if ext == "jpg" || ext == "jpeg" || ext == "png" || ext == "gif" {
println("read image file")
} else if ext == "txt" || ext == "md" {
println("read text file")
} else if ext == "yml" || ext == "yaml" {
println("read yaml file")
} else if ext == "ini" {
println("read ini file")
} else {
println("unsupported file extension:", ext)
}
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go语言中的switch语句在灵活性、可读性和功能上都有重要的改进与创新。与C语言的switch语句相比,Go语言中的switch语句对表达式类型的限制更加宽松,支持各种类型的值作为表达式类型,使得代码更加灵活。此外,switch语句支持声明临时变量,最大程度地缩小了变量的作用域,同时支持表达式列表,使得代码实现更加简单、清晰、易懂。Go语言取消了默认执行下一个case代码逻辑的语义,每个case对应的分支代码执行完后就结束switch语句,提高了代码的可读性。同时,引入了关键字fallthrough来实现显式执行下一个case的代码逻辑,增加了灵活性。另外,Go语言的switch语句还支持type switch,即用类型信息作为分支条件判断的操作数,这种使用方式也是switch所独有的。文章还提到了在使用switch语句时可能遇到的问题,如跳不出循环的break,以及解决方法。总的来说,本文全面介绍了Go语言中switch语句的特点和优势,为读者快速了解和掌握该知识提供了有益的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Tony Bai · Go 语言第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(15)

  • 最新
  • 精选
  • qinsi
    type switch里的 switch v := x.(type) { 看上去像是一个初始化语句,但其实是一个type guard,所以后面没有分号。如果有初始化语句的话就是这样的: switch a:= f(); v := x.(type) { 另外type switch里是不能fallthrough的

    作者回复: 👍

    2021-12-04
    36
  • 一打七
    文中说x.(type)这种表达式形式是 switch 语句专有的,但是类型断言也可以这么写,所以不应该是专有的吧?

    作者回复: 只有switch表达式可以用x.(type),类型断言的格式是类似像x.(*int)的形式,类型断言后面括号里必须是某个具体的类型。而switch表达式的x.(type)就是x.(type)。

    2022-02-12
    2
    14
  • lyy
    个人感觉fallthrough,执行完 case1 后,继续case2里面的代码,而不用判断case2的条件是否成立,这一点设计的并不好,估计很多人会理解为继续判断case2条件

    作者回复: 但是如果按你的设计,fallthrough后,先要判断下一个case的条件,那么fallthrough的意义就不存在了,因为下一个case的条件求值后基本不会是true。

    2022-02-06
    5
    9
  • 文经
    白老师,我这样理解对不对: x.(type) 如果没有 := 符号的话,这个表达式是获取x的具体类型 v := x.(type), 这个则是把x从具体的接口类型中获取它实际类型的值。 x.(SomeType), 则是判段x是否遵守SomeType接口,并转化为具体类型的值。 所有的这些行为都是编译器把它转化为相应的代码。

    作者回复: 差不多。

    2021-12-24
    3
  • lesserror
    Tony Bai 老师的文章讲解的非常细致,鼓掌。 想问一下老师,文中的内容基本都能理解,但是过一段时间就遗忘比较多了,尤其是后面的内容涉及到前面的知识时。希望老师在这门课中搞个小型的实战项目,能把前面的知识串在一起就好了。 这样,不会觉得纸上得来终觉浅......

    作者回复: 后续会有实战项目,尽量串联吧。

    2021-11-26
    3
    3
  • 十年一劫
    老师,现在go支持泛型了,type switch语句中传入的类型可以用泛型么

    作者回复: 是这样的么? package main import "fmt" func switchOnType[T any](i interface{}) T { switch v := i.(type) { case T: return v default: panic("unsupported type") } } func main() { var i interface{} = true b := switchOnType[bool](i) fmt.Printf("b type: %T value:%v\n", b, b) } 我试了一下, go 1.21是支持的。

    2023-11-29归属地:浙江
    1
  • plh
    switch 太灵活,即使有经验的go开发者也容易犯错. 看过好几篇文章,这个地方是讲的最全面,最清晰的.

    作者回复: 👍

    2023-05-28归属地:四川
    1
  • qiutian
    哪来的case2呢

    作者回复: 在这个case中: case case2_1(), case2_2(): println("exec case2")

    2022-06-01
    2
    1
  • peison
    我想请教一下,文中type switch中的 v:=x.(type)后面,为什么switch中的case分支,不是和x.(type)的返回值v做比较?那实际上case分支是和什么值做比较

    作者回复: type switch是go的一种比较特殊的语法。能运用该语法的x.(type)中的x必须是interface类型。 case分支是用某类型与x的动态类型作比较。而v := x.(type)中的v存储的是转换后对应的动态类型的值。

    2022-04-09
    1
  • ps Sensking
    我们要注意的是只有接口类型变量才能使用 type switch,并且所有 case 语句中的类型必须实现 switch 关键字后面变量的接口类型。 您好这个例子用interface 里面只要实现一个 int 或者 string 就可以正常启动吗? 如果是type 自定义的类型 T 就需要制定一个int 或者 string吗?

    作者回复: 问题没太看懂。文中例子switch x.(type) 中的x是一个interface{}类型接口,Go所有类型都实现了该接口,包括自定义类型T。

    2022-01-22
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部