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

时间:2016-05-06 19:01:16

标签: go buffer

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

     outputReader := io.MultiReader(outReader, errReader)
     scanner := bufio.NewScanner(outputReader)
     for scanner.Scan(){
        scanner.Text():
     }   

3 个答案:

答案 0 :(得分:1)

如果您被困在连续循环中并且点击 Moment 无助于退出 type MyMoment = DeclMerge<moment.Moment, { isMyMoment: true }>; declare const myMoment1: MyMoment; declare const myMoment2: MyMoment; myMoment1.diff(myMoment2); declare const moment: moment.Moment; myMoment1.diff(moment); // error! // Property 'isMyMoment' is missing in type 'Moment' 的循环,那么尝试 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) } } } 之后,scanner.Scan() 退出了循环。

答案 1 :(得分:1)

文档说明:

<块引用>

当扫描停止时返回 false,无论是到达输入的末尾还是错误。 Scan返回false后,Err方法会返回扫描过程中发生的任何错误,除非是io.EOF,Err会返回nil。

因此,要停止扫描,您可以在阅读一行文本后手动跳出循环,也可以等待返回 false。如果您需要不同的功能,您可能希望直接使用 io.Readerio.Reader 的文档说明:

<块引用>

如果某些数据可用但 len(p) 字节不可用,则 Read 通常会返回可用的数据,而不是等待更多数据。

因此,Read 方法将立即返回而不是像 bufio.Scanner 那样阻塞。

如果您确实想要使用 bufio.Scanner 并希望阻止它读取,您必须通过传入的 io.Reader 发送一个 EOF。一个例子如下图所示:

https://play.golang.org/p/ZF8bHX25KFq

package main

import (
    "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")
}

答案 2 :(得分:0)

Scanner.Scan()将返回一个bool。您不需要执行任何其他操作,因为for循环将在其扫描结束时评估为false时退出。