欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

golang教程之switch语句

程序员文章站 2022-03-04 20:11:04
...

switch语句

原文:https://golangbot.com/switch/

switch是一个条件语句,它计算表达式并将其与可能的匹配列表进行比较,并根据匹配执行代码块。它可以被认为是编写多个if else子句的惯用方法。

让我们从一个简单的例子开始,该例子将手指号作为输入并输出该手指的名称。 例如1是拇指,2是食指,依此类推。

package main

import (  
    "fmt"
)

func main() {  
    finger := 4
    switch finger {
    case 1:
        fmt.Println("Thumb")
    case 2:
        fmt.Println("Index")
    case 3:
        fmt.Println("Middle")
    case 4:
        fmt.Println("Ring")
    case 5:
        fmt.Println("Pinky")

    }
}

在上述程序中,switch finger将手指的值与每个case语句进行比较。 案例从上到下进行评估,并执行与表达式匹配的第一个案例。在这种情况下,finger的值为4,因此打印Ring

不允许具有相同常量值的重复case。 如果你试图运行下面的程序,编译器会报错main.go:18:2: duplicate case 4 in switch previous case at tmp/sandbox887814166/main.go:16:7

package main

import (  
    "fmt"
)

func main() {  
    finger := 4
    switch finger {
    case 1:
        fmt.Println("Thumb")
    case 2:
        fmt.Println("Index")
    case 3:
        fmt.Println("Middle")
    case 4:
        fmt.Println("Ring")
    case 4://duplicate case
        fmt.Println("Another Ring")
    case 5:
        fmt.Println("Pinky")

    }
}

默认情况

我们手中只有5个手指。 如果输入错误的手指号码会发生什么。 这是默认情况下的情况。 当没有其他情况匹配时,将执行默认情况。

package main

import (  
    "fmt"
)

func main() {  
    switch finger := 8; finger {
    case 1:
        fmt.Println("Thumb")
    case 2:
        fmt.Println("Index")
    case 3:
        fmt.Println("Middle")
    case 4:
        fmt.Println("Ring")
    case 5:
        fmt.Println("Pinky")
    default: //default case
        fmt.Println("incorrect finger number")
    }
}

在上面的程序中,手指是8并且它与任何情况都不匹配,因此打印了不正确的手指号码。 默认值不一定是switch语句中的最后一种情况。 它可以出现在任何位置。

您可能还注意到手指声明中的一个小变化。 它在交换机本身中声明。 开关可以包括在评估表达式之前执行的可选语句。 在这行switch finger:= 8; 首先声明手指并在表达式中使用。 在这种情况下,手指的范围仅限于switch块。

多个表达式

通过用逗号分隔它们,可以在一个案例中包含多个表达式。

package main

import (  
    "fmt"
)

func main() {  
    letter := "i"
    switch letter {
    case "a", "e", "i", "o", "u": //multiple expressions in case
        fmt.Println("vowel")
    default:
        fmt.Println("not a vowel")
    }
}

上面的程序检查字母是否是元音。“a”,“e”,“i”,“o”,“u”:`匹配所有元音。 该程序输出元音。

无表达式的switch

表达式中的表达式是可选的,可以省略。 如果省略表达式,则认为switch为真,并且每个case表达式都被评估为真,并且执行相应的代码块。

package main

import (  
    "fmt"
)

func main() {  
    num := 75
    switch { // expression is omitted
    case num >= 0 && num <= 50:
        fmt.Println("num is greater than 0 and less than 50")
    case num >= 51 && num <= 100:
        fmt.Println("num is greater than 51 and less than 100")
    case num >= 101:
        fmt.Println("num is greater than 100")
    }

}

在上述程序中,表达式在开关中不存在,因此它被认为是真实的并且评估了每种情况。 case num> = 51 && num <= 100:为true且程序输出num大于51且小于100.这种类型的开关可以被视为多个if else子句的替代。

Fallthrough

在Go中,控件在执行case后立即从switch语句中出来。 fallthrough语句用于将控制转移到在已执行的case之后立即出现的case的第一个语句。

让我们写一个程序来了解fallthrough。 我们的程序将检查输入数字是否小于50,100或200.例如,如果我们输入75,程序将打印75小于100和200.我们将使用fallthrough实现此输出。

package main

import (  
    "fmt"
)

func number() int {  
        num := 15 * 5 
        return num
}

func main() {

    switch num := number(); { //num is not a constant
    case num < 50:
        fmt.Printf("%d is lesser than 50\n", num)
        fallthrough
    case num < 100:
        fmt.Printf("%d is lesser than 100\n", num)
        fallthrough
    case num < 200:
        fmt.Printf("%d is lesser than 200", num)
    }
}

Switch和case表达式不一定只是常量。 它们也可以在运行时进行评估。 在上面的程序中,num初始化为函数number()的返回值。 控制器进入开关内部并评估。 case num <100:为true且程序打印75小于100.下一个语句是fallthrough。 当遇到fallthrough时,控件移动到下一个case的第一个语句,并且打印75小于200.程序的输出是

75 is lesser than 100  
75 is lesser than 200  

fallthrough应该是case中的最后一个语句。 如果它出现在中间的某个位置,编译器将抛出错误的fallthrough语句

相关标签: go