Go - 如何增加最大标准输入长度?

从 Go 中的标准输入读取时允许超过 1024 个字符的推荐方法是什么?


例如,此代码使用bufio.Scanner的最大输入长度为 1024。


package main


import (

    "bufio"

    "fmt"

    "os"

)


func main() {

    scanner := bufio.NewScanner(os.Stdin)

    scanner.Scan()

    input := scanner.Text()

    fmt.Println(input)

}

在一些建议的答案之后更新......对不起,我一定仍然做错了什么,或者错误地陈述了问题。我尝试了这两个建议,但仍然看到相同的问题。下面是代码的更新版本。症状是扫描仪不接受第 1024 个字符之后的输入。例如,尝试运行它然后粘贴一个长度为 1025 个字符的字符串,它会在字符 1024 之后停止接受输入。


package main


import (

    "bufio"

    "bytes"

    "fmt"

    "log"

    "os"

)


func main() {

    var buffer bytes.Buffer

    scanner := bufio.NewScanner(os.Stdin)


    for {

        done := scanner.Scan()

        buffer.WriteString(scanner.Text())

        if done == true {

            if scanner.Err() != nil {

                log.Fatal("Error scanning input")

            }

            break

        }

    }

    fmt.Println(buffer.String())

}


慕标5832272
浏览 159回答 3
3回答

一只斗牛犬

你忽略了它的返回值,scanner.Scan()它bool表明你是否已经到达终点。具体来说:当扫描停止时,它返回 false,无论是到达输入的末尾还是错误。Scan返回false后,Err方法会返回扫描过程中发生的任何错误,除非是io.EOF,Err会返回nil。所以你需要继续scanner.Scan()循环运行,直到它返回false,然后检查.Err()以确保你没有因为非EOF错误而停止扫描。

拉丁的传说

这段代码的主要问题是scanner.Scan的返回值不是true扫描完成了,而是true扫描没有完成。在我们解决这个问题的同时,让我们整理另一件事,因为您不需要使用if done == true但可以简单地做if done另外,请记住done = Scanner.Text(), 和作为终止条件,我们可以很好地整理代码:for scanner.Scan() { // This does what you want, looping until scanner                     // is no longer true.    buffer.WriteString(scanner.Text())}if err := scanner.Err(); err != nil {           // Let's hold on to err...    log.Fatalf("Error scanning input: %s", err) // and use it here.}您可以丢弃很多行,并且只在循环结束时检查 Err() 一次。无需使用中断。希望这对您有用,如果您需要其他东西,请给我留言。编辑:还有两件事需要注意。1)bufio.Scanner.Scan()将吃掉你所有的分隔符。也许没关系,或者您可能想继续将它们重新添加进去。2)bufio.Scanner.Scan()如果您的 SplitFunc 错误,或者有人为您的 SplitFunc 制作了糟糕的输入,则bytes.Buffer.WriteString()可能会发生恐慌,如果缓冲区太大,则可能会发生恐慌。如果您在生产系统中使用这些,请确保以任何有意义的方式处理这些恐慌。

慕仙森

您可以这样做而不是使用Scanner...reader := bufio.NewReaderSize(os.Stdin, 65536)line, isPrefix, err := reader.ReadLine()编写一个辅助函数来继续阅读,直到读完一行...func ReadLine(reader *bufio.Reader) (string, error) {    result := ""    for {        line, isPrefix, err := reader.ReadLine()        if err != nil {            return result, err        }        result += string(line)        if !isPrefix {            return result, nil        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go