Golang 条件语句

266 阅读2分钟

条件语句

条件语句需要开发者通过指定一个或多个条件,并通过检查条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况下执行另外的语句

If 语句

if 布尔表达式 {
    // 在布尔表达式为 true 时执行
    ...
}
if 布尔表达式 {
    // 在布尔表达式为 true 时执行
    ...
} else {
    // 在布尔表达式为 false 时执行
    ...
}
if 布尔表达式 1 {
    // 在 布尔表达式 1true 时执行
    ...
    if 布尔表达式 2 {
        // 在 布尔表达式 2true 时执行
        ...
    }
}

switch 语句

switch 语句基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上到下逐一检查,直到匹配为止

switch 默认情况下 case 最后自带 break 语句,不用再加 break,匹配成功后就不会再执行其他 case

如果需要强制执行匹配成功后下面的 case 语句,可以使用 fallthrough

switch v_name {
    case val1 : 
        ...
    case val2, val3 : 
        ...
    default : 
        ... 
}
switch {
    case v_name == val1 : 
        ...
    case v_name == val2, v_name == val3 : 
        ...
    default : 
        ...
}

使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true

switch v_name {
    case val1 : 
        ...
    case val2, val3 : 
        ...

        if (...) {
            Break
        } 
        
        fallthrough // 此时 case val4 的语句会被强制执行;如果 if 语句返回 true,则不强制执行 case val4

    case val4 : 
        ...
    default : 
        ... 
}

Select 语句

select 语句是 Go 中的一个控制结构,类似于用于 通信 的 switch 语句

每一个 case 都必须是一个 通信操作,要么是 发送,要么是 接收

所有的 channel 表达式都会被求值

所有被发送的表达式都会被求值

如果任意某个通信可以进行,它就执行,其他被忽略

如果有多个 case 都可以运行,select 会随机地选择一个执行,其他的不会执行

如果没有 case 可以运行: 如果有 default 语句,则执行该语句 如果没有 default 语句,select 将阻塞,直到某个通信可以运行;Go 不会重新对 channel 或值进行求值

select {
    case communication clause :  // 通信条款
        statement(s);            // 声明
    case communication clause : 
        statement(s); 
    default :                    // 可选
        statement(s);
}
package main

import (
    "fmt"
    "time"
)

func ChanTran (ch chan int, stopCh chan bool) {
    i := 10
    for j := 0; j < 10; j++ {
        ch <- i
        time.Sleep(time.Second)
    } 
    stopCh <- true
}

func main () {
    ch := make (chan int)
    stopCh := make (chan int)
    c := 0

    Go ChanTran(ch, stopCh)

    for {
        select {
            case c = <-ch : 
                fmt.Println ("Recvice", c, 1) 
            case s := <-ch : 
                fmt.Println ("Recvice", s, 2) 
            case _ = <-stopCh : 
                goto end
        }
    }

    end:
}