0
点赞
收藏
分享

微信扫一扫

go基础之select

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)
}
}
}
}

举报

相关推荐

0 条评论