0

嘿伙计们,我在玩一些缓冲区,我只是写了一些代码来了解 Read() 是如何工作的

package main

import (
    "bytes"
    "fmt"
    "io"
)

func main() {
    tmp := make([]byte, 2)
    data := []byte("HEL")

    dataReader := bytes.NewReader(data)
    dest := make([]byte, len(data))
    for {
        n, err := dataReader.Read(tmp)
        fmt.Println(n)
        fmt.Println(string(tmp))
        dest = append(dest, tmp[:]...)
        if err == io.EOF {
            break
        }
    }
    fmt.Println(string(dest))
}
output:
2 -> n
HE -> tmp[:]
1 -> n
LE -> tmp[:]
0 -> n
LE -> tmp[:]
HELELE -> dest

所以我知道输出是错误的,我实际上应该temp[:n]写字节,但是看着输出我意识到 tmp 缓冲区在每次迭代时都不会被清除,当 n 为 1 时也不应该缓冲区的内容是 EL,我的意思是 L 被添加到未附加的 tmp 之前。我看了看读取功能,但无法理解。谁能给我解释一下。

4

1 回答 1

1

在第一次迭代中,Read读取两个字节,您的程序产生HE输出。在第二次迭代中,Read将一个字节读入tmp. 现在tmp[0]包含该字节,但tmp[1]仍包含E第一次迭代期间的读取。但是,您将所有附加tmpdest,得到HELE。第三次, read 读取 0 个字节,但您仍然将LEin附加tmpdest.

您的程序的正确版本是:

 for {
        n, err := dataReader.Read(tmp)
        fmt.Println(n)
        fmt.Println(string(tmp))
        dest = append(dest, tmp[:n]...)

        if err == io.EOF {
            break
        }
    }
于 2020-04-20T15:19:23.040 回答