老男孩IT教育,只培养技术精英

全国免费咨询电话:400-609-2893
Go编程学习之Go语言 select 条件语句

    /    2018-11-07

select 语句是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。

每个case必须是一个通信操作,要么是发送要么是接收,select中的default子句总是可运行的。

如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行。如果没有可运行的case语句,且有default语句,那么就会执行default的动作。如果没有可运行的case语句,且没有default语句,select将阻塞,直到某个case通信可以运行。

select 应用

1、select 语句基本使用

package main

import "fmt"

func main() {
    var c1, c2, c3 chan int
    var i1, i2 int
    select {
    case i1 = <-c1:
        fmt.Printf("received ", i1, " from c1\n")
    case c2 <- i2:
        fmt.Printf("sent ", i2, " to c2\n")
    case i3, ok := (<-c3):
        if ok {
            fmt.Printf("received ", i3, " from c3\n")
        } else {
            fmt.Printf("c3 is closed\n")
        }
    default:
        fmt.Printf("no communication\n")
    }
}

2、超时判断

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    select {
    case i := <-ch:
        fmt.Printf("i = %d\n", i)
    case <-time.After(time.Second * 3):
        fmt.Println("time out")
    }
}

3、判断channel是否阻塞

package main

import (
    "fmt"
)

func main() {
    // 在某些情况下是存在不希望channel缓存满了的需求的,可以用如下方法判断
    ch := make(chan int, 5)
    data := 0
    select {
    case ch <- data:
        fmt.Println("ch <- data")
    default:
        fmt.Println("default")
    }
}

(0)

分享至