从 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())
}

最佳答案

这段代码的主要问题是scanner.Scan的返回值不是true,如果scanner完成,而是true,如果scanner没有完成。

在我们解决这个问题的同时,让我们整理另一件事,因为您不需要使用

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) 如果您的 SplitFunc 错误,或者有人为您的 SplitFunc 制作了糟糕的输入,bufio.Scanner.Scan() 可能会 panic ,如果缓冲区太大,bytes.Buffer.WriteString() 可能会 panic 。如果您在生产系统中使用这些,请确保以任何有意义的方式处理这些 panic 。

关于Go - 如何增加最大标准输入长度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34189401/

10-16 10:21