go - 使用停止 channel 停止 bufio.Scanner

标签 go

我正在写一些从 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/

相关文章:

regex - 如何使正则表达式仅在两个以上的分组匹配时才匹配?

synchronization - 在 channel 上阻塞发送一个错误的同步范例以及为什么

mysql - 如何为 go-sqlmock 正确设置 Mock Row 和 Query

http - go语言如何通过http请求下载文件

sql - 使用GORM和PostgreSQL查找半径10km附近的所有行

Go - 解码/编码 asn.1

go - Golang反射: Inspect a struct type definition to extract its properties without initialization

json - 如何在 slice 内对 slice 进行 json 解码

amazon-web-services - AWS Elastic Beanstalk 应用程序和静态 Assets 部署隔离

go - 未定义的错误变量