当前位置:首页 > 科技  > 软件

Go中的switch的六种使用:没有你想象中那么简单

来源: 责编: 时间:2023-12-04 09:21:25 339观看
导读Go以其简洁而著称,但并不是每个人都熟悉这种语言中switch语句的多样性。首先,如果你对Go的switch语句还不熟悉,它可能与其他语言相比有些不同。下面是一个简单的示例来展示它是什么样子的:func main() { var i int = 1

Go以其简洁而著称,但并不是每个人都熟悉这种语言中switch语句的多样性。首先,如果你对Go的switch语句还不熟悉,它可能与其他语言相比有些不同。8wj28资讯网——每日最新资讯28at.com

下面是一个简单的示例来展示它是什么样子的:8wj28资讯网——每日最新资讯28at.com

func main() {    var i int = 1    switch i {        case 1:        fmt.Println("i is 1")        case 2:        fmt.Println("i is 2")        default:        fmt.Println("i is not 1 or 2")    }}

Go的switch语句有一个很酷的特性,即在找到匹配项后就会停止执行,不需要在每个case的末尾加上break语句。8wj28资讯网——每日最新资讯28at.com

在Go的switch语句中有两个部分:分号前的部分是初始化器,分号后的部分是要检查的值。8wj28资讯网——每日最新资讯28at.com

可以选择使用两个部分、其中一个部分或者都不使用:8wj28资讯网——每日最新资讯28at.com

switch initializer; value {}switch initializer {}switch value {}switch {}

很有趣,是吧?8wj28资讯网——每日最新资讯28at.com

使用字面布尔值的switch

有时候,可能会使用一个变量的switch语句,但这里有一种不同的方法。8wj28资讯网——每日最新资讯28at.com

考虑使用一个带有字面布尔值的switch语句。这种方法可以让我们检查多个条件,而不仅仅局限于一个变量的值。8wj28资讯网——每日最新资讯28at.com

func main() {    var a int = 1    var b int = 2    switch true { // <--- use true literal        case a == 1 && b == 2:        fmt.Println("a is 1 and b is 2")        case a == 3:        fmt.Println("a is 3"):        default:        fmt.Println("a is not 1 or 3")    }}

乍一看,switch true可能似乎是多余和无意义的。8wj28资讯网——每日最新资讯28at.com

它感觉有点像在陈述显而易见的事实,但好消息是Go有一种更简化的处理方式,可以像这样简化它:8wj28资讯网——每日最新资讯28at.com

switch { // <--- just remove `true`    case a == 1 && b == 2:    ...}

这种简化的方法同样有效。8wj28资讯网——每日最新资讯28at.com

另外,switch语句也可以与false字面值一起使用,提供了一种确定哪些条件未满足的方法。8wj28资讯网——每日最新资讯28at.com

Switch短赋值

我们经常忽视switch语句中的初始化器部分。8wj28资讯网——每日最新资讯28at.com

但它非常有用,与if语句或for循环中的初始化器类似。它允许你声明并赋值一个变量,然后立即使用它。8wj28资讯网——每日最新资讯28at.com

下面是一个例子来说明这一点:8wj28资讯网——每日最新资讯28at.com

switch a := 1; a {    case 1:    fmt.Println("a is 1")}// similarif a := 1; a == 1 {    fmt.Println("a is 1")}

在这些情况下,变量a的作用域仅限于switch语句,意味着不能在外部使用a。8wj28资讯网——每日最新资讯28at.com

还记得我们可以忽略switch的两个部分吗?8wj28资讯网——每日最新资讯28at.com

你也可以选择只使用初始化器部分,当你这样做时,值部分被假定为true:8wj28资讯网——每日最新资讯28at.com

switch a := 1 {    case a == 1:    fmt.Println("a is 1")    case a == 2:    fmt.Println("a is 2")}

到目前为止,我们已经看到了四种组织switch语句的方式:只使用初始化器、只使用值、两者都使用或者两者都不使用。但我们的重点主要在于switch本身。8wj28资讯网——每日最新资讯28at.com

接下来,我们将深入探讨case部分的作用以及如何在代码中充分利用它。8wj28资讯网——每日最新资讯28at.com

包含多个值的case

你可以在一个case中组合多个值。这种方法可以使你的代码更简洁易读:8wj28资讯网——每日最新资讯28at.com

switch a := 1; a {    case 1, 2, 3: // <--    fmt.Println("a is 1, 2 or 3")}

很多Go的新手并不知道这个功能。相反,他们可能会写出这样的代码:8wj28资讯网——每日最新资讯28at.com

switch a := 1; a {    case 1:case 2:case 3:    fmt.Println("a is 1, 2 or 3")}

但这种方法并不完全正确,因为switch在Go中的工作方式不同。8wj28资讯网——每日最新资讯28at.com

在这个例子中,打印语句只与最后一个case(case 3)相关联。所以,如果a是1或2,什么也不会发生,因为这些case后面没有指令,程序会直接跳过它们。8wj28资讯网——每日最新资讯28at.com

使用fallthrough关键字的case

这个关键字允许执行继续到下一个case而不检查其条件。这与大多数语言处理switch case的方式有些不同。8wj28资讯网——每日最新资讯28at.com

下面是一个例子来展示fallthrough的工作方式:8wj28资讯网——每日最新资讯28at.com

switch a := 1; a {    case 1:    fmt.Println("a is 1")    fallthrough    case 2:    fmt.Println("Now in case 2")    default:    fmt.Println("Neither 1 nor 2")}

输出会是什么?8wj28资讯网——每日最新资讯28at.com

在这种情况下,当a为1时,程序首先打印“a is 1”。然后,由于fallthrough关键字的存在,它会立即跳转到下一个case(case 2),而不检查a是否实际上为2。所以,它也会打印出“Now in case 2”。8wj28资讯网——每日最新资讯28at.com

你仍然可以在case 2中使用fallthrough关键字,程序会继续执行下一个case(default),并打印“Neither 1 nor 2”。8wj28资讯网——每日最新资讯28at.com

switch a := 1; a {    case 1:    fmt.Println("a is 1")    fallthrough    case 2:    fmt.Println("Now in case 2")    fallthrough    default:    fmt.Println("Neither 1 nor 2")}// Output:// a is 1// Now in case 2// Neither 1 nor 2

但要记住,在Go中,fallthrough关键字绕过了下一个case的条件检查。因此,在switch语句的最后一个case中不使用它,因为没有后续的case可以过渡到。8wj28资讯网——每日最新资讯28at.com

默认情况和其细微差别

Go中的switch语句的默认情况类似于if语句中的else部分。8wj28资讯网——每日最新资讯28at.com

当没有任何其他case匹配时,它将执行默认情况,但是在Go中,默认情况有一些有趣的特点:8wj28资讯网——每日最新资讯28at.com

尽管在大多数编程语言中,默认情况通常放在末尾,但在Go中,它可以放置在switch语句的任何位置。大多数人为了清晰起见会把它放在末尾,但让我们看看当我们把它放在开头时会发生什么:8wj28资讯网——每日最新资讯28at.com

switch a := 1; a {    default:    fmt.Println("Neither 1 nor 2")    case 1:    fmt.Println("a is 1")    case 2:    fmt.Println("Now in case 2")}

在这个例子中,即使默认情况首先出现,它仍然被视为最后的选择,只有在没有其他case匹配时才会执行。8wj28资讯网——每日最新资讯28at.com

但还有另一层可以探索。8wj28资讯网——每日最新资讯28at.com

如果我们将默认情况与fallthrough关键字混合使用会怎么样?让我们来看看:8wj28资讯网——每日最新资讯28at.com

switch a := 3; a {    default:    fmt.Println("Neither 1 nor 2")    fallthrough    case 1:    fmt.Println("a is 1")    case 2:    fmt.Println("Now in case 2")}// Output:// Neither 1 nor 2// a is 1

在这种情况下,当a为3时,switch从默认情况开始,打印“Neither 1 nor 2”。然后,由于fallthrough的存在,它会移动到下一个case,打印“a is 1”。8wj28资讯网——每日最新资讯28at.com

带有类型断言的switch

switch语句不仅可以处理值,还可以处理类型。这在处理接口时特别有用。8wj28资讯网——每日最新资讯28at.com

类型断言是实现这一功能的特性,它允许检查接口值的类型,并根据该类型运行不同的代码段:8wj28资讯网——每日最新资讯28at.com

func main() {    var i interface{} = "hello"    switch v := i.(type) {        case int:        fmt.Println("i is an int and its value is", v)        case string:        fmt.Println("i is a string and its value is", v)        default:        fmt.Println("Unknown type")    }}

在这种情况下,i是一个存储字符串的接口变量。8wj28资讯网——每日最新资讯28at.com

switch语句使用i.(type)来确定i的类型,然后根据该类型选择要执行的case:8wj28资讯网——每日最新资讯28at.com

  • 它逐个检查每个case是否为特定类型(如int或string)。
  • 在每个case中,v表示i作为该case中检查的类型的值,因此可以像使用该类型的任何变量一样使用v。

本文链接:http://www.28at.com/showinfo-26-37266-0.htmlGo中的switch的六种使用:没有你想象中那么简单

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 什么是软件架构需要演进的时机,你懂吗?

下一篇: Electron 自动更新,绕过 latest.yml 使用自定义接口

标签:
  • 热门焦点
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的&ldquo;在线鉴别&rdquo;,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起&ldquo;冯提莫&rdquo;这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的&ldquo;斗鱼一姐&rdquo;,冯提莫在游戏直播的年代影响力不输于现
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
Top