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

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

Go Channels - 推送到通道會停止執行

Go Channels - 推送到通道會停止執行

Go
慕雪6442864 2023-08-07 11:07:39
我正在嘗試創建一個命令行測驗,用戶將被問到一個又一個問題,直到他們完成最后一個問題或超時。我想使用渠道,這樣我就可以學習如何正確使用它們,可以說,我遇到了障礙。CorrectAnswersCh 的想法是從 0 開始,每次正確答案后,它都會增加 1。在我將零放入通道后,測驗始終停止在 quiz() 函數的第 3 行。我在下面添加了一些代碼,但完整的代碼在這里: https://play.golang.org/p/vzRCTc7MpIKfunc main() {    questions, err := getCsvData()    var limit = time.Duration(3)    flag.Parse()    if err != nil {        log.Fatal(err)    }    quizComplete := make(chan bool)    correctAnswersCh := make(chan int)    go quiz(quizComplete, questions, correctAnswersCh)    select {    case <-time.After(limit*time.Second):        fmt.Println("Timed Out")    }    fmt.Printf("Correct Answers: %v\n", <-correctAnswersCh)}func quiz(quizComplete chan bool, questions [][]string, correctAnswersCh chan int) {    reader := bufio.NewReader(os.Stdin)    correctAnswersCh <- 0    // execution stops here.  0 is added to correctAnswersCh, then the quiz func stops    for _, question := range questions {        fmt.Print(question[0], "= ")        answer, _ := reader.ReadString('\n')        if strings.TrimSpace(answer) == question[1] {            cA := <-correctAnswersCh            cA++            correctAnswersCh <- cA        }    }    quizComplete <- true}
查看完整描述

1 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

您的correctAnswersCh頻道是無緩沖的,因此在其中發送任何內容都會受到阻塞,直到有人從其中接收為止。由于您的main()函數僅在超時后接收來自它的信息,因此在此之前您的應用程序將被阻止。

一種簡單的解決方法是為通道提供 1 個緩沖區:

correctAnswersCh?:=?make(chan?int,?1)

盡管這是渠道的一些奇怪用法。如果您的目的是創建并發安全計數器,請使用 aotmic 計數器,例如atomic.AddInt32()。另一種選擇是在從多個 goroutine 并發訪問時使用互斥體(sync.Mutexsync.RWMutex)來保護資源(變量)。


查看完整回答
反對 回復 2023-08-07
  • 1 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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