2016-12-06 35 views
2

我經歷Go by Example: Non-Blocking Channel Operationsgo中的非阻塞通道操作。發送?

據我瞭解,第一select觸發了default情況下,因爲有沒有在messages通道,如果default情況下不存在,我們會得到一個fatal error: all goroutines are asleep - deadlock!錯誤,對嗎?

好了,我想不通我怎麼能觸發第二select,特別是觸發case messages <- msg:

因爲我認爲,它應該工作對面的接收。因此,如果有2條消息的緩衝區,並且我們將第3條消息發送到通道,則會觸發default子句,但messages通道爲空,那麼爲什麼在第二次選擇時會觸發default子句?我怎樣才能觸發case messages <- msg:條款?

回答

4

爲什麼在第二次選擇它會觸發默認子句?

因爲頻道沒有緩衝,並且在接收時沒有其他的去路程被阻止。

我該如何觸發案件消息< - msg:clause?

您可以:

  1. messages緩衝

    messages := make(chan string, 1) 
    

    https://play.golang.org/p/b1aO6N-dYf

  2. 創建另一個去阻塞在接收

    程序

    https://play.golang.org/p/Z7e1ZcO3C5

+0

更多的問題:d 但希望我會弄清楚它是對我自己的,謝謝! – Arno

+0

@Arno,閱讀這篇文章http://stackoverflow.com/questions/18660533/why-using-unbuffered-channel-in-the-the-same-goroutine-gives-a-deadlock的解釋:) –