停止以下扫描的最佳方法是什么?
outputReader := io.MultiReader(outReader, errReader)
scanner := bufio.NewScanner(outputReader)
for scanner.Scan(){
scanner.Text():
}
答案 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.Reader
。 io.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
时退出。