进入非阻塞通道

时间:2018-10-01 08:53:14

标签: go nonblocking channel goroutine

我有一些这样的代码:

go func(ch chan bool) chan bool {

    // some processing
    ch <- true
    return ch
}(ch)

for i := 0; i < TotalQuestions; i++ {
    // check if channel ch has some value
    // If it has then execute below statements, else break out of the loop


    fmt.Println(questions[i])
    answer, _ := InputReader.ReadString('\n')

    // some processing

}
fmt.Println("Your Total score is " + strconv.Itoa(TotalScore) + " out of " + strconv.Itoa(TotalQuestions))

现在,我要检查通道ch是否具有值(在for循环中)。如果它有一个值,那么我想突破for循环以打印最后一条语句。否则,我想继续循环。我试图插入选择块,但没有用(通道被阻止,代码未显示问题)。该怎么做?

1 个答案:

答案 0 :(得分:1)

package main

import (
    "fmt"
    "log"
    "math/rand"
    "time"
)

func main() {

    // user score, no.of questions asked so far
    var score, num int
    var correct bool // temporary variable to decide if the answer is right
    // questions
    var questions = make([]string, 13)

    t1 := time.Tick(time.Second * 7) // timer
loop:
    for {
        select {
        case <-t1:
            log.Println("ran out of time")
            break loop
        default:
            // have any questions further questions to ask
            if num < len(questions) {

                // simulate typing
                time.Sleep(time.Millisecond * 777)

                // correct or wrong answer
                correct = (rand.Intn(777)%2 == 0)

                if correct {
                    fmt.Println("you did it")
                    score++ //increase score
                } else {
                    fmt.Println("try again")
                }

            } else {
                // no questions, state and break
                log.Println("all questions were finished")
                break loop //break loop, all questions were finished
            }
            num++
        }
    }

    //print final score
    fmt.Println("your score is:", score)
}