Ответ 1
Логическая переменная ok
, возвращаемая оператором приема , указывает, было ли полученное значение отправлено по каналу (true) или равно нулю значение возвращается, потому что канал закрыт и пуст (false).
Цикл for
завершается, когда какая-либо другая часть программы Go закрывает канал fromServer
или fromUser
. В этом случае один из операторов case установит ok
в значение true. Поэтому, если пользователь закрывает соединение или удаленный сервер закрывает соединение, программа завершается.
http://play.golang.org/p/4fJDkgaa9O:
package main
import "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")
}