2012-04-14 2 views
4

の値: - :ゴルーチンチャンネル - 私はプリントアウトしようとした送信文の

に評価するだろう、それはエラーメッセージが表示されました
fmt.Println(c <- x)
を直前のループのために、以下のコードブロックに「X C <」かを確認します

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

送信操作が成功した場合、「c <-x」はtrueと評価されますか。なぜ、Goはselect文の中のcase文の中でsend文(別名 "< - 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 
      } 
     } 
    } 

答えて

8
それは本当だ

c <- x文であり、値はありません、ありがとうございました。

selectswitchを混同している可能性があります。スイッチは、どのcase式が真であるか評価されているかを見ることで動作します。一方、Selectを選択すると、ブロックしていないケースが検索され、その1つを選択して処理を続行し、caseブロック内のステートメントを実行します。

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

の受信オペレーションを受信した場合、短い宣言で割り当てられた変数はケースブロックのスコープ内にのみ存在します。上記のselect文の場合、短い宣言はありませんが、caseブロックの終了後に受け取った値が必要な場合は、簡単な宣言ではなく簡単な宣言を使用します。それは本当に非常に読みやすいです。

+0

私のPythonの脳が私のゴーゴールと矛盾し、コールバック(structInstance.method)として "callback"を試してみると、誤って同じことが起こることがあります。 – jdi

関連する問題