导读 | 在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="" :="">-channel1:><-channel2: fmt.println("received",msg2)="" case="">-channel2:><-time.after(500*time.millisecond): 设置超时时间,0.5秒没有接到消息就执行="" fmt.println("no="" messages")="" }="">-time.after(500*time.millisecond):>
如果先接收到channel1就先执行channel1分支,如果接收到channel2,就执行channel2分支,如果在规定的时间没有接收到消息,就会执行超时的分支。
程序调用内置的close函数关闭了通道,关闭通道并不会导致通道的机能完全停止,他的作用就是通知其他正在尝试从这个通道接收值的goroutine,这个通道已经不会再接受到任何值了。
case msg, ok1 = <-a 从通道a里面取出的值将被赋值给变量,而变量ok1则会被设置为用于表示通道是否仍然处于打开状态的布尔值,如果通道关闭,ok1的值被设置为false。="">-a>
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="">-a:><-b: if="" ok2="" {="" fmt.printf("%s="" from="" b\n",="" msg)="" }="" }="" }="">-b:>