该文档指出:


当扫描停止时,它返回 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/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")

}