gpt4 book ai didi

go - 前往 channel -推送至 channel 会停止执行

转载 作者:行者123 更新时间:2023-12-01 21:16:14 27 4
gpt4 key购买 nike

我正在尝试创建一个命令行测验,在该测验中,将逐个问题地询问用户,直到他们完成最后一个问题或超时为止。

我想使用 channel ,以便我可以学习如何正确使用它们,可以说,我遇到了障碍。

这个想法是将correctAnswersCh从0开始,在每个正确答案之后,它将递增1。

在将零放入 channel 后,测验总是在quiz()函数的第3行停止。

我在下面添加了一些代码,但是完整的代码在这里:
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
}

最佳答案

您的correctAnswersCh channel 是无缓冲的,因此在该 channel 上发送任何内容都会被阻止,直到有人从该 channel 接收到为止。而且由于main()函数仅在超时后才从中接收,因此直到那时您的应用程序都被阻止。

一种简单的解决方法是为 channel 提供1个缓冲区:

correctAnswersCh := make(chan int, 1)

虽然这是一些奇怪的 channel 用法。如果您打算创建并发安全计数器,请使用原子计数器,例如 atomic.AddInt32() 。另一种选择是当从多个goroutine同时访问时,使用互斥锁( sync.Mutex sync.RWMutex )保护资源(变量)。

关于go - 前往 channel -推送至 channel 会停止执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58914677/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com