Я пытаюсь создать викторину командной строки, в которой пользователям будет задаваться вопрос за вопросом, пока они либо не ответят на последний вопрос, либо не истечет время ожидания.
Я хотел использовать каналы, чтобы научиться правильно их использовать, и я, так сказать, наткнулся на блокировщик.
Идея состоит в том, чтобы correctAnswersCh начинался с 0, и после каждого правильного ответа он увеличивался на 1.
Тест всегда останавливается на строке 3 функции quiz() после того, как я ставлю ноль в канал.
Я добавил немного кода ниже, но полный код находится здесь: https://play.golang.org/p/vzRCTc7MpIK
func 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
}