2012-04-14 41 views
4

當我試圖打印出:夠程渠道 - 發送語句的值

fmt.Println(c <- x)
前右在下面的代碼塊中環看什麼「C < - X」將評估爲,它得到了錯誤消息:

./select.go:7:發送語句c < - x用作值;使用select for non-blocking send

如果發送操作成功,「c < -x」是否爲真?爲什麼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 
      } 
     } 
    } 

謝謝

回答

8

這是真的,c <- x是一個語句也沒有任何價值。

您可能會困惑selectswitch。 Switch通過查看哪個表達式匹配或計算結果爲true來工作。另一方面,選擇查找未阻塞的情況,選擇其中一個允許繼續,然後在情況塊中運行語句。

因此否,c <- x未被評估爲正確的發送操作成功。而是簡單地執行該案例塊的聲明,即x, y = y, x + y 。沒有發送結果,沒有真正的價值,存儲在任何地方。

你可能已經讀取了接收操作,用短declarion分配一個變量是隻在殼體塊的範圍。這是真的(儘管上面的select語句沒有簡短的聲明)。如果你有一個case case,你需要在case塊結束後收到一個值,你可以使用一個簡單的賦值而不是簡短的聲明。

Oblig:the language spec on the select statement。它非常可讀。

+0

當我的python大腦與我的Go目標發生衝突時,我會偶然做同樣的事情,並嘗試將「callback」作爲「callback(structInstance.method) – jdi 2012-04-14 03:18:43