导读 在golang语言中,select语句 就是用来监听和channel有关的IO操作,当IO操作发生时,触发相应的case动作。有了 select语句,可以实现 main主线程 与 goroutine线程 之间的互动。

go有一个特殊的关键字select,它允许用户从多个通道中选择一个通道来接收。

package main

import (
    "fmt"
    "time"
)

func ping1 (c chan string){
    time.Sleep(time.Second*1)
    c <- "ping on channel1"
}

func ping2 (c chan string){
    time.Sleep(time.Second*2)
    c <- "ping on channel2"
}

func main(){
    channel1 := make(chan string)
    channel2 := make(chan string)
    go ping1(channel1)
    go ping2(channel2)
    select {
    case msg1 := <-channel1:
        fmt.Println("received",msg1)
    case msg2 := <-channel2:
        fmt.Println("received",msg2)
    case <-time.After(500*time.Millisecond): //设置超时时间,0.5秒没有接到消息就执行
        fmt.Println("no messages")
    }
}

如果先接收到channel1就先执行channel1分支,如果接收到channel2,就执行channel2分支,如果在规定的时间没有接收到消息,就会执行超时的分支。
程序调用内置的close函数关闭了通道,关闭通道并不会导致通道的机能完全停止,他的作用就是通知其他正在尝试从这个通道接收值的goroutine,这个通道已经不会再接受到任何值了。
case msg, ok1 = <-a 从通道a里面取出的值将被赋值给变量,而变量ok1则会被设置为用于表示通道是否仍然处于打开状态的布尔值,如果通道关闭,ok1的值被设置为false。

package main

import (
    "fmt"
)

func callerA(c chan string) {
    c <- "hello world"
    close(c)
}

func callerB(c chan string) {
    c <- "hello zhangsan"
    close(c)
}

func main() {
    a, b := make(chan string), make(chan string)
    go callerA(a)
    go callerB(b)
    var msg string
    ok1, ok2 := true, true
    for ok1 || ok2 {
        select {
        case msg, ok1 = <-a:
            if ok1 {
                fmt.Printf("%s from A\n", msg)
            }
        case msg, ok2 = <-b:
            if ok2 {
                fmt.Printf("%s from B\n", msg)
            }
        }
    }
}

原文来自:https://blog.51cto.com/u_3764469/5606042

本文地址:https://www.linuxprobe.com/go-select-js.html编辑:问题终结者,审核员:逄增宝

Linux命令大全:https://www.linuxcool.com/

Linux系统大全:https://www.linuxdown.com/

红帽认证RHCE考试心得:https://www.rhce.net/