web-dev-qa-db-ja.com

Goのチャネルは2つの値を返しますか?

このリンクにいくつかのコードがあり、混乱しました: 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
        }
    }

}
21
hardPass

受信演算子 によって返されるブール変数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")
}
26
user811773

いくつかの回答が受信演算子の仕様を引用していますが、理解するには、おそらく 関数を閉じる の仕様も読む必要があります。次に、これらの機能がどのようになっているのか不思議に思うので、 forステートメント がチャネル全体でどのように変化するかを読んでください。 forステートメントには反復を停止するシグナルが必要であり、closeは送信者が「これ以上データがありません」と言うことができる方法です。

close, ok = <-言語の一部として公開されており、送信ゴルーチンで「これ以上データがない」ことを通知したい場合に使用できます。問題のサンプルコードは、これらの機能の興味深い使用法です。 「サーバー」チャネルと「ユーザー」チャネルの両方を処理しており、どちらかどちらかから「これ以上データがない」信号が到着した場合は、ループから抜け出します。

10
Sonia

Go言語仕様の関連セクションを参照してください: http://golang.org/ref/spec#Receive_operator

2
newacct