接收操作符
ok返回的布尔变量指示接收的值是在通道上发送的(true)还是由于通道关闭且为空而返回的零值(false)。
for当Go程序的其他部分关闭
fromServer或
fromUser通道时,循环终止。在这种情况下,其中一个case语句将设置
ok为true。因此,如果用户关闭连接或远程服务器关闭连接,程序将终止。
http://play.golang.org/p/4fJDkgaa9O:
package mainimport "runtime"func onServer(i int) { println("S:", i) }func onUser(i int) { println("U:", i) }func main() { fromServer, fromUser := make(chan int),make(chan int) var serverData, userInput int var ok bool go func() { fromServer <- 1 fromUser <- 1 close(fromServer) runtime.Gosched() fromUser <- 2 close(fromUser) }() isRunning := true for isRunning { select { case serverData, ok = <-fromServer: if ok { onServer(serverData) } else { isRunning = false } case userInput, ok = <-fromUser: if ok { onUser(userInput) } else { isRunning = false } } } println("end")}


