15、Go 流程控制 - switch 语句

作者: 温新

分类: 【Go基础】

阅读: 665

时间: 2023-08-07 14:39:53

hi,我是温新

对于有多个 if、else if 、else 条件判断时,写起来很繁琐,可以使用 switch 语句进行改造。

在 Go 语言中,switch 表示选择语句的关键字,它会根据初始化表达式得出一个值,然后根据 case 语句的条件,执行相应的代码块,最终返回特定的内容。

每一种 case 都是一种独立的情况,只有初始化表达式的值与之匹配时,case 才会被执行。

在 Go 语言中,switch 有 表达式 switch类型 switch 这两种类型。

两种类型的 switch

表达式 switch

表达式 switch 语句中,case 包含与 switch 表达式的值进行比较的表达式。

package main

import "fmt"

func main() {
    grade := "A"
    marks := 90

    switch marks {
        case 90:
            grade = "A"
        case 80:
            grade = "B"
        case 60, 79:
            grade = "C"
        default:
            grade = "D"
    }
    fmt.Printf("你的成绩是%s\n", grade)
}

在这个案例中,switch 语句后跟着一个变量值,选择语句根据这个变量值来执行哪个 case。如果 marks=91 该执行哪个?对于这个问题进一个改造。

package main

import "fmt"

func main() {
    grade := "A"
    marks := 75

    switch {
        case marks >= 90:
            grade = "A"
        case marks >= 80:
            grade = "B"
        case marks >= 70:
            grade = "C"
        case marks >= 60:
            grade = "D"
        default:
            grade = "E"
    }

    switch {
        case grade == "A":
            fmt.Println("优秀")
        case grade == "B":
            fmt.Println("良好")
        case grade == "C", grade == "D":
            fmt.Println("再接再厉")
        default:
            fmt.Println("别放弃治疗")
    }
    fmt.Println(grade)
}

在这个案例中,两个 switch 存在关联情况,第一个 switch 用于判断区间并得到 grade 的值,第二个 switch 再根据 grade 的值来输出相应的结果。

类型 switch

类型 switch 中,case 包含与特殊注意的 switch 表达式的类型进行比较的类型。

package main

import "fmt"

// 空接口
var x interface{}

func main() {
    x = "hello"

    switch i := x.(type) {
    case nil:
        fmt.Printf("x 的类型是 %T", i)
    case int:
        fmt.Printf("x 的类型是 %T", i)
    case float64:
        fmt.Printf("x 的类型是 %T", i)
    case bool:
        fmt.Printf("x 的类型是 %T", i)
    case string:
        fmt.Printf("x 的类型是 %T", i)
    default:
        fmt.Println("未知类型")
    }
}

类型 switch 语句中,判断条件必须是具有接口类型的变量。

switch 初始化语句

单值判断

package main

import "fmt"

func main() {
    switch marks := 90; marks {
        case 90:
            fmt.Println("A")
        case 80:
            fmt.Println("B")
        default:
            fmt.Println("...")
    }
}

范围表达式

package main

import "fmt"

func main() {
    // 注意,分号不能省略
    switch marks := 90; {
        case marks >= 90:
            fmt.Println("A")
        case marks >= 80:
            fmt.Println("B")
        default:
            fmt.Println("别放弃治疗")
    }
}
请登录后再评论