• 2.9 Go语言中的Switch


    基本语法

    在讲述if-else时已经提到,如果有多个判断条件,Go语言中提供了Switch-Case的方式。如果switch后面不带条件相当于switch true

    // Convert hexadecimal character to an int value
     switch {
     case '0' <= c && c <= '9':
         return c - '0'
     case 'a' <= c && c <= 'f':
         return c - 'a' + 10
     case 'A' <= c && c <= 'F':
         return c - 'A' + 10
     }
     return 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    fallthrough使用方法

    默认情况下,case满足执行后会进行break,后面case即使满足条件也不再循环,如果想继续执行,则需要添加fallthrough,

    package main
    
    import "fmt"
    
    func main() {
        i := 3
        switch i {
        case i > 0:
            fmt.Println("condition 1 triggered")
            fallthrough
        case i > 2:
            fmt.Println("condition 2 triggered")
            fallthrough
        default:
            fmt.Println("Default triggered")
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    此时所有的case都会被执行

    condition 1 triggered
    condition 2 triggered
    Default triggered
    
    • 1
    • 2
    • 3

    多条件匹配

    如果同一个条件满足,也可以这样罗列到同一条件,相当于或条件

    switch i {
        case 0, 1:
            f()
        default:
            g()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    判断接口(interface)类型

    空接口

    后面我们会讲到接口,通过switch可以对type进行判断,获取接口的真实类型。

    package main
      
    import "fmt"
      
    func main() {
        var value interface{}
        switch q:= value.(type) {
           case bool:
           fmt.Println("value is of boolean type")
           case float64:
           fmt.Println("value is of float64 type")
           case int:
           fmt.Println("value is of int type")
           default:
           fmt.Printf("value is of type: %T", q)
       }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在上面的例子中,我们定义了一个空接口

    var value interface{}
    
    • 1

    同时使用switch来判断类型

    switch q:= value.(type) {
    
    • 1

    由于空接口没有内容,所以类型为nil,触发了default

    value is of type: <nil>
    
    • 1

    获取实际类型

    我们对上面的例子进行改造,同时让空接口拥有实际的值,再来看看执行的效果

    package main
    
    import "fmt"
    
    func valueType(i interface{}) {
        switch q:= i.(type) {
           case bool:
           fmt.Println("value is of boolean type")
           case float64:
           fmt.Println("value is of float64 type")
           case int:
           fmt.Println("value is of int type")
           default:
           fmt.Printf("value is of type: %T\n", q)
    
       }
    }
    
    func main() {
        person := make(map[string]interface{}, 0)
    
        person["name"] = "Alice"
        person["age"] = 21
        person["height"] = 167.64
    
        fmt.Printf("%+v\n", person)
    
        for _, value := range person {
            valueType(value)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    这里有几个还没有讲到的知识点:

    • 函数的定义方法
    • 定义了一个map,但是值的类型为空接口,意思就是可以是任何类型的值,这在接口章节还会详细讲解,所以大家看到这里不要纠结,继续往下看
    • 赋值时,特意给value不同的类型, string/int/float类型

    最后通过循环将变量传给valueType函数,看看程序输出什么结果

    map[age:21 height:167.64 name:Alice]
    value is of type: string
    value is of int type
    value is of float64 type
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    Python中将字典转为成员变量
    OpenCV第二篇:读取图像和保存图像
    怒刷LeetCode的第28天(Java版)
    来瞧瞧,WPF 炫酷走马灯!
    【408考研】数据结构 —— 第三章 栈、队列
    构建api gateway之 openresty 中如何使用 wasm
    Clion配置远程服务器并在上面开发
    非凸科技受邀出席源创会,探讨数据技术的未来发展
    40+的年龄50W+的年薪,2线城市入职名企,他曾想放弃测试?
    Java 21 虚拟线程如何限流控制吞吐量
  • 原文地址:https://blog.csdn.net/xiaoquqi/article/details/125532907