从标准输入读取大量数据

Awn*_*Awn 5 linux buffer stdin go

你如何从 Golang 的 stdin 中读取大量数据?我所有的读取当前都在 4095 字节处停止。我已经尝试了很多东西,但我当前的代码看起来像:

var stdinReader = bufio.NewReader(os.stdin)

// Input reads from stdin while echoing back.
func Input(prompt string) []byte {
    var data []byte

    // Output prompt.
    fmt.Print(prompt)

    // Read until newline.
    for {
        bytes, isPrefix, _ := stdinReader.ReadLine()
        data = append(data, bytes...)

        if !isPrefix {
            break
        }
    }

    // Everything went well. Return the data.
    return data
}
Run Code Online (Sandbox Code Playgroud)

我也试过使用扫描仪,但不知道如何退出

for scanner.Scan() {
    data = append(data, scanner.Bytes()...)
}
Run Code Online (Sandbox Code Playgroud)

当换行发生时(即当用户按下回车键时)。

我也试过 ReadBytes('\n') 但即使是在 4095 字节处停止。除了增加缓冲区的大小(这只是一个丑陋的黑客),我不知道此时该怎么做。

Ale*_* R. 2

如果您查看 Go 源代码,您会发现它使用默认缓冲区大小:

func NewReader(rd io.Reader) *Reader {
    return NewReaderSize(rd, defaultBufSize)
}
Run Code Online (Sandbox Code Playgroud)

所以你可以在你的代码中使用:

var stdinReader = bufio.NewReaderSize(os.Stdin, 10000)
Run Code Online (Sandbox Code Playgroud)

PS Go 是开源的,因此您只需查看内部结构就可以学到很多东西。