我们如何在 golang 中停止 bufio 扫描?

停止以下扫描的最佳方法是什么?


     outputReader := io.MultiReader(outReader, errReader)

     scanner := bufio.NewScanner(outputReader)

     for scanner.Scan(){

        scanner.Text():

     }   


郎朗坤
浏览 682回答 3
3回答

繁星点点滴滴

如果您陷入连续循环并且ENTER在退出循环时没有帮助scanner.Scan(),请尝试ctrl+Z退出循环。下面是从控制台获取输入并打印重复行的示例代码。func main() {    counts := make(map[string]int)    scanner := bufio.NewScanner(os.Stdin)    fmt.Println("Accepting inputs")    for scanner.Scan() {        counts[input.Text()]++    }    // NOTE: ignoring potential errors from input.Err()    fmt.Println("Printing output")    for line, n := range counts {        if n > 1 {            fmt.Printf("Count: %d\t Line: %s\n", n, line)        }    }}控制台输出:Accepting inputsHihellohiHi^ZPrinting outputCount: 2         Line: Hi我们可以看到,在按下ctrl+Zscanner.Scan() 之后就退出了循环。

RISEBY

Scanner.Scan()将返回一个布尔值。您无需执行任何其他操作,因为 for 循环将在其评估结果false结束时退出它正在扫描的内容。

Cats萌萌

该文档指出:当扫描停止时,它返回 false,无论是到达输入的末尾还是错误。Scan 返回 false 后,Err 方法将返回扫描过程中发生的任何错误,除非是 io.EOF,否则 Err 将返回 nil。因此,要停止扫描,可以在读取一行文本后手动跳出循环,也可以等到false返回。如果你需要不同的功能,你可能想io.Reader直接使用。io.Reader状态的文档:如果某些数据可用但 len(p) 字节不可用,则 Read 通常会返回可用的数据,而不是等待更多数据。因此,该Read方法将立即返回,而不是像bufio.Scanner会那样阻塞。如果您确实想使用bufio.Scanner并阻止它读取,则必须通过io.Reader传入的 EOF 发送一个 EOF 。下面显示了一个示例:https://play.golang.org/p/ZF8bHX25KFqpackage mainimport (    "bufio"    "fmt"    "os"    "time")func main() {    r, w, err := os.Pipe()    if err != nil {        panic(err)    }    scanner := bufio.NewScanner(r)    go func() {        w.WriteString("line of text\n")        time.Sleep(time.Second)        w.Close()    }()    for scanner.Scan() {        fmt.Printf("scanned \"%v\"\n", scanner.Text())    }    err = scanner.Err()    if err != nil {        panic(err)    }    fmt.Println("done scanning")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go