このリンクにいくつかのコードがあり、混乱しました: http://www.darkcoding.net/software/go-lang-after-four-months/
2番目の値(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
}
}
}
受信演算子 によって返されるブール変数ok
は、受信した値がチャネルで送信されたか(true)、チャネルが閉じていて空であるために返されたゼロ値であるか(false)を示します。 。
for
ループは、Goプログラムの他の部分がfromServer
またはfromUser
チャネルを閉じると終了します。その場合、caseステートメントの1つが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")
}
いくつかの回答が受信演算子の仕様を引用していますが、理解するには、おそらく 関数を閉じる の仕様も読む必要があります。次に、これらの機能がどのようになっているのか不思議に思うので、 forステートメント がチャネル全体でどのように変化するかを読んでください。 forステートメントには反復を停止するシグナルが必要であり、close
は送信者が「これ以上データがありません」と言うことができる方法です。
close
と, ok = <-
言語の一部として公開されており、送信ゴルーチンで「これ以上データがない」ことを通知したい場合に使用できます。問題のサンプルコードは、これらの機能の興味深い使用法です。 「サーバー」チャネルと「ユーザー」チャネルの両方を処理しており、どちらかどちらかから「これ以上データがない」信号が到着した場合は、ループから抜け出します。
Go言語仕様の関連セクションを参照してください: http://golang.org/ref/spec#Receive_operator