1 回答

TA貢獻1875條經驗 獲得超5個贊
因為你有一個無緩沖的通道,如果有另一個 goroutine 準備好從它接收,你只能在無緩沖的通道上發送一個值而不會阻塞。
由于你只有 1 個 goroutine,它會被阻塞。解決方案很簡單:Quack.quack()在一個新的 goroutine 中啟動你的方法:
go self.quack(ch)
然后是輸出(在Go Playground上試試):
mockQuack start
mockQuack done
true
另一種選擇是不啟動新的 goroutine 而是創建一個緩沖通道,這樣它就可以保存一些值,而無需任何接收器準備好接收它:
ch := make(chan bool, 1) // buffered channel, buffer for 1 value
這將創建一個通道,該通道能夠“存儲”一個值,而無需任何接收器準備接收它。通道上的第二次發送也會阻塞,除非首先從它接收到值(或者接收器準備好從它接收值)。
在Go Playground上試試這個緩沖通道版本。
規范中的相關部分:發送聲明:
通道和值表達式都在通信開始之前進行評估。通信阻塞,直到發送可以繼續。如果接收器準備好,則可以在無緩沖通道上進行發送。如果緩沖區中有空間,則可以繼續緩沖通道上的發送。關閉通道上的發送會導致運行時恐慌。在nil通道上發送永遠阻塞。
筆記:
根據您打印的接收值true或false. 這可以用一行來完成,而不需要以下if語句:
fmt.Println(b)
您甚至可以擺脫b局部變量,并立即打印接收到的值:
fmt.Println(<-ch)
另外我假設您使用通道是因為您想使用它們,但在您的情況下mockQuack()可以簡單地返回bool值,而不使用通道。
- 1 回答
- 0 關注
- 196 瀏覽
添加回答
舉報