20|控制结构:Go中的switch语句有哪些变化?
该思维导图由 AI 生成,仅供参考
认识 switch 语句
- 深入了解
- 翻译
- 解释
- 总结
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)
- 最新
- 精选
- qinsitype switch里的 switch v := x.(type) { 看上去像是一个初始化语句,但其实是一个type guard,所以后面没有分号。如果有初始化语句的话就是这样的: switch a:= f(); v := x.(type) { 另外type switch里是不能fallthrough的
作者回复: 👍
2021-12-0436 - 一打七文中说x.(type)这种表达式形式是 switch 语句专有的,但是类型断言也可以这么写,所以不应该是专有的吧?
作者回复: 只有switch表达式可以用x.(type),类型断言的格式是类似像x.(*int)的形式,类型断言后面括号里必须是某个具体的类型。而switch表达式的x.(type)就是x.(type)。
2022-02-12214 - lyy个人感觉fallthrough,执行完 case1 后,继续case2里面的代码,而不用判断case2的条件是否成立,这一点设计的并不好,估计很多人会理解为继续判断case2条件
作者回复: 但是如果按你的设计,fallthrough后,先要判断下一个case的条件,那么fallthrough的意义就不存在了,因为下一个case的条件求值后基本不会是true。
2022-02-0659 - 文经白老师,我这样理解对不对: x.(type) 如果没有 := 符号的话,这个表达式是获取x的具体类型 v := x.(type), 这个则是把x从具体的接口类型中获取它实际类型的值。 x.(SomeType), 则是判段x是否遵守SomeType接口,并转化为具体类型的值。 所有的这些行为都是编译器把它转化为相应的代码。
作者回复: 差不多。
2021-12-243 - lesserrorTony Bai 老师的文章讲解的非常细致,鼓掌。 想问一下老师,文中的内容基本都能理解,但是过一段时间就遗忘比较多了,尤其是后面的内容涉及到前面的知识时。希望老师在这门课中搞个小型的实战项目,能把前面的知识串在一起就好了。 这样,不会觉得纸上得来终觉浅......
作者回复: 后续会有实战项目,尽量串联吧。
2021-11-2633 - 十年一劫老师,现在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 - plhswitch 太灵活,即使有经验的go开发者也容易犯错. 看过好几篇文章,这个地方是讲的最全面,最清晰的.
作者回复: 👍
2023-05-28归属地:四川1 - qiutian哪来的case2呢
作者回复: 在这个case中: case case2_1(), case2_2(): println("exec case2")
2022-06-0121 - 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-091 - ps Sensking我们要注意的是只有接口类型变量才能使用 type switch,并且所有 case 语句中的类型必须实现 switch 关键字后面变量的接口类型。 您好这个例子用interface 里面只要实现一个 int 或者 string 就可以正常启动吗? 如果是type 自定义的类型 T 就需要制定一个int 或者 string吗?
作者回复: 问题没太看懂。文中例子switch x.(type) 中的x是一个interface{}类型接口,Go所有类型都实现了该接口,包括自定义类型T。
2022-01-22