我正在嘗試創建一個命令行測驗,用戶將被問到一個又一個問題,直到他們完成最后一個問題或超時。我想使用渠道,這樣我就可以學習如何正確使用它們,可以說,我遇到了障礙。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.Mutex
或sync.RWMutex
)來保護資源(變量)。
- 1 回答
- 0 關注
- 145 瀏覽
添加回答
舉報
0/150
提交
取消