3 回答

TA貢獻1803條經驗 獲得超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 inputs
Hi
hello
hi
Hi
^Z
Printing output
Count: 2 Line: Hi
我們可以看到,在按下ctrl+Zscanner.Scan() 之后就退出了循環。

TA貢獻1805條經驗 獲得超9個贊
該文檔指出:
當掃描停止時,它返回 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")
}
- 3 回答
- 0 關注
- 585 瀏覽
添加回答
舉報