4

印刷しようとしたとき:

fmt.Println(c <-x)
以下のコードブロックのforループの直前で、「c <-x」が何に評価されるかを確認すると、エラーメッセージが表示されます。

./select.go:7:ステートメントc<-xを値として使用します。非ブロッキング送信にはselectを使用します

送信操作が成功した場合、「c <-x」はtrueと評価されますか?また、Goでは、selectステートメント内のcaseステートメント内でsendステートメントの値(別名「c <-x」の値)のみを使用できるのはなぜですか?

    func fibonacci(c, quit chan int) {
        x, y := 1, 1

        for {
            select {
            case c <- x:
                x, y = y, x + y
            case <-quit:
                fmt.Println("quit")
                return
            }
        }
    }

ありがとうございました

4

1 に答える 1

8

それは真実でc <- xあり、ステートメントであり、価値はありません。

と混同selectしている可能性がありますswitch。Switchは、どのケース式がtrueに一致するか、またはtrueと評価されるかを確認することで機能します。一方、Selectは、ブロックされていないケースを探し、続行できるようにそれらの1つを選択してから、caseブロック内のステートメントを実行します。

したがってc <- x、送信操作が成功した場合、真とは評価されません。代わりに、caseブロックのステートメントx, y = y, x + y が単純に実行されます。送信の結果はなく、真の値もどこにも保存されません。

受信操作の場合、短い宣言が割り当てられた変数は、caseブロックのスコープ内にのみ存在することをお読みになったかもしれません。これは真実です(上記のselectステートメントの場合には短い宣言はありませんが)。caseブロックの終了後に受信した値が必要な場合は、短い宣言ではなく単純な割り当てを使用します。

義務:selectステートメントの言語仕様。とても読みやすいです。

于 2012-04-14T03:02:40.510 に答える