2 回答
TA贡献1827条经验 获得超9个赞
正如 Dave C 和 JimB 所说,使用通道来协调 goroutine。这是一个可能会有所帮助的示例。
收到用户的5条消息后退出:
package main
import "fmt"
var pipe = make(chan string) //shares text entered by user
var stop = make(chan bool) //shares stop signal
func listen() {
for {
var input string
fmt.Scan(&input)
pipe <- input
}
}
func write() {
for i := 0; i < 5; i++ {
var output string
output = <-pipe
fmt.Println("Received", output)
}
stop <- true
}
func main() {
go listen()
go write()
<-stop
}
TA贡献1862条经验 获得超6个赞
首先,您的代码有一个围绕stop变量的竞赛。当发生数据竞争时,无法保证您的程序会按照定义的那样运行。使用通道来同步 goroutine。然而,这不是您继续编程的原因。
您的代码在 上阻塞fmt.Scanf,无法检查stop条件。由于无法中断 Stdin 上的读取(发生在 内部fmt.Scanf),因此您需要在Scanf再次调用之前检查停止条件。如果没有更多输入,但您在 Stdin 上有一个待处理的 Read,处理它的最简单方法是让 goroutine 运行。有一些相当复杂的方法可以使用称为“自管道”的技巧来解决这个问题,但通常不值得付出努力,因为 goroutine 很小并且不占用太多资源。
for !stop {
fmt.Scanf("%s", &str)
fmt.Println("Entered :", str)
// use a channel to detect when to exit
select {
case <-stop:
return
default:
}
}
- 2 回答
- 0 关注
- 225 浏览
添加回答
举报