亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我們如何在 golang 中停止 bufio 掃描?

我們如何在 golang 中停止 bufio 掃描?

Go
郎朗坤 2022-01-10 14:20:50
停止以下掃描的最佳方法是什么?     outputReader := io.MultiReader(outReader, errReader)     scanner := bufio.NewScanner(outputReader)     for scanner.Scan(){        scanner.Text():     }   
查看完整描述

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() 之后就退出了循環。


查看完整回答
反對 回復 2022-01-10
?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

Scanner.Scan()將返回一個布爾值。您無需執行任何其他操作,因為 for 循環將在其評估結果false結束時退出它正在掃描的內容。


查看完整回答
反對 回復 2022-01-10
?
Cats萌萌

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")

}


查看完整回答
反對 回復 2022-01-10
  • 3 回答
  • 0 關注
  • 585 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號