我在此链接中看到了一些代码,并感到困惑:http://www.darkcoding.net/software/go-lang-after-four-months/
第二个值的意义是什么(ok)?
for self.isRunning {
select {
case serverData, ok = <-fromServer: // What's the meaning of the second value(ok)?
if ok {
self.onServer(serverData)
} else {
self.isRunning = false
}
case userInput, ok = <-fromUser:
if ok {
self.onUser(userInput)
} else {
self.isRunning = false
}
}
}
答案 0 :(得分:20)
receive operator返回的布尔变量ok
表示接收的值是在通道上发送的(true)还是返回的零值,因为通道已关闭且为空(false)。 / p>
当Go程序的其他部分关闭for
或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")
}
答案 1 :(得分:8)
有几个答案引用了接收运算符的规范,但要了解您可能还需要阅读close function上的规范。然后,由于您会想知道为什么这些功能是这样的,请阅读for statement在频道上的范围。 for语句需要一个信号来停止迭代,close
是发送者可以说“没有更多数据”的方式。
当close
和, ok = <-
作为语言的一部分公开时,您可以在其他情况下使用它们,当您希望发送goroutine发出“没有更多数据”的信号时。问题中的示例代码是这些功能的有趣用法。它正在处理“服务器”通道和“用户”通道,如果从“ 到达”没有更多数据“信号,它就会突破循环。
答案 2 :(得分:2)
请参阅Go语言规范中的相关部分: http://golang.org/ref/spec#Receive_operator
答案 3 :(得分:-1)
Go,功能&amp;通道可以返回超过1个值。这里ok必须是带有true(成功)和false(不成功)的布尔变量,serverData是从通道接收的实际数据。