亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang:無法在頻道上發送

Golang:無法在頻道上發送

Go
回首憶惘然 2022-01-10 19:10:56
為什么它不在通道上發送并阻止執行?我怎樣才能使這個星座工作,以便我可以發送信號MoneyDive()并繼續執行?package mainimport (    "fmt")type Quack func(ch chan bool)type DagobertDuck struct {    quack Quack}func (self *DagobertDuck) MoneyDive() {    ch := make(chan bool)    self.quack(ch)    b := <-ch    if b {        fmt.Println("true")    } else {        fmt.Println("false")    }}func mockQuack(ch chan bool) {    fmt.Println("mockQuack start")    ch <- true    fmt.Println("mockQuack done")}func main() {    dd := DagobertDuck{quack: mockQuack}    dd.MoneyDive()}https://play.golang.org/p/1omlb7u6-A
查看完整描述

1 回答

?
慕田峪4524236

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值,而不使用通道。


查看完整回答
反對 回復 2022-01-10
  • 1 回答
  • 0 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號