go中的非阻塞通道
Non-blocking channel in go
我有一些这样的代码:
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 循环来打印最后一条语句。否则,我想继续我的循环。我尝试插入 select 块,但没有用(通道被阻塞,代码没有打印问题)。怎么做?
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)
}
我有一些这样的代码:
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 循环来打印最后一条语句。否则,我想继续我的循环。我尝试插入 select 块,但没有用(通道被阻塞,代码没有打印问题)。怎么做?
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)
}