我正在写一些从 os.Stdin
读取行的东西使用 bufio.Scanner
喜欢:
for s.scanner.Scan() {
line := s.scanner.Text()
// process line
}
这是在 goroutine 中运行的,我希望能够在
chan struct{}
时停止它关闭。然而作为 Scan
阻塞直到有另一条线,我不知道如何停止它,如果没有更多输入,它会无限期地阻塞。任何人都可以指出我正确的方向吗?
最佳答案
通过创建更多的间接并忽略底层,我们可以停止。
// actual reading, converts input stream to a channel
func readUnderlying(lines chan interface{}) {
s := bufio.NewScanner(os.Stdin)
for s.Scan() {
lines <- s.Text()
}
lines <- s.Err()
}
func read(stop chan struct{}) {
input := make(chan interface{}) // input stream
go readUnderlying(input) // go and read
for {
select { // read or close
case lineOrErr := <-input:
fmt.Println(lineOrErr)
case <-stop:
return
}
}
}
func main() {
stop := make(chan struct{})
go read(stop)
// wait some to simulate blocking
time.Sleep(time.Second * 20) // it will print what is given
close(stop)
time.Sleep(time.Second * 20) // stopped so no more processing
}
关于go - 使用停止 channel 停止 bufio.Scanner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60960288/