2014-10-10 27 views
-1

1 - 使chan中斷的條件是什麼?有關渠道進入的一些問題

deliveries <-chan amqp.Delivery 
for d:= range deliveries{ 
    .. 
} 

如果在幾分鐘內沒有更多的數據傳遞,它會中斷。 代碼是否與下面相同?

deliveries <- chan amqp.Delivery 
for{ 
    d,ok:=<-deliveries 
    if !ok{ 
     break 
    } 
    //code 
} 

2 - 爲什麼chan不僅返回數據,還有狀態?「ok」是什麼意思?

3-chan如何實現?「ok」是關於客戶端的狀態,爲什麼它可以返回「ok」?

回答

0

我將回答問題2和3的第一,因爲答案提供上下文爲我答覆問題1.

2,3)的內置函數close(c)記錄沒有更多的值將被髮送到通道c。

receive表達式中的第二個結果是一個bool,用於指示操作是否成功。如果接收到發送的值,則第二個結果爲true;如果由於通道已關閉而收到零值,則返回false。

1)通道上的範圍接收通道上發送的值,直到通道關閉。

以下循環非常相似。他們都收到值,直到頻道關閉。

for v := range c { 
    // code 
} 

for { 
    v, ok := <-c 
    if != ok { 
     break 
    } 
    // code 
} 

這些循環的主要區別在於變量v的範圍。 v的範圍在第一個循環之外,在第二個循環之內。這個區別很重要,如果你use a closure and goroutine in the loop

+0

即使在關閉的情況下,我幾乎在每種情況下都會推薦第一個(一行代碼)在第二個(四行代碼)之上。你總是可以將'v'作爲參數傳入你的goroutine(或者如果需要的話重新聲明它)。更多的行==更多的錯誤。例如第二種形式的代碼不能編譯。 – Dustin 2014-10-13 17:13:51

0

1)代碼1和2不同:第二個也提取ok,指示通道是否被髮送方關閉。這使得你的代碼更加健壯。

2)通道只能傳輸一種類型的消息。如果你需要狀態碼,你可以把它放在信息裏面。

+0

如果排除魯棒性,代碼1和2是否相同?代碼1是否死循環? – 2014-10-10 09:46:11

+1

使用for/select代替頻道範圍絕對不*使您的代碼更健壯,不應該完成。通道關閉後,循環將終止。編寫更多的代碼只是爲bug引入更多的機會。 – Dustin 2014-10-13 17:08:49