从标准输入中读取大量数据

时间:2017-03-14 07:17:17

标签: linux go buffer stdin

你如何从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
}

我也尝试使用扫描仪,但无法弄清楚如何退出

for scanner.Scan() {
    data = append(data, scanner.Bytes()...)
}

发生换行时(即用户按下返回时)。

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

2 个答案:

答案 0 :(得分:1)

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

func NewReader(rd io.Reader) *Reader {
    return NewReaderSize(rd, defaultBufSize)
}

因此您可以在代码中使用:

var stdinReader = bufio.NewReaderSize(os.Stdin, 10000)

P.S。 Go是开源的,所以你可以通过查看内部内容来学到很多东西。

答案 1 :(得分:0)

我认为这与终端具有用于标准输入的固定大小的缓冲区有关。除了将数据传递到文件或网络位置或从文件或网络位置读取数据之外,我不确定是否有其他解决方法。