golang复制函数理解

golang复制函数理解,go,Go,嘿,伙计们,我在玩一些缓冲区,我只是写了一些代码来理解Read()是如何工作的 主程序包 进口( “字节” “fmt” “io” ) func main(){ tmp:=make([]字节,2) 数据:=[]字节(“HEL”) dataReader:=bytes.NewReader(数据) dest:=make([]字节,len(数据)) 为了{ n、 错误:=dataReader.Read(tmp) fmt.Println(n) fmt.Println(字符串(tmp)) dest=appen

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

主程序包
进口(
“字节”
“fmt”
“io”
)
func main(){
tmp:=make([]字节,2)
数据:=[]字节(“HEL”)
dataReader:=bytes.NewReader(数据)
dest:=make([]字节,len(数据))
为了{
n、 错误:=dataReader.Read(tmp)
fmt.Println(n)
fmt.Println(字符串(tmp))
dest=append(dest,tmp[:]…)
如果err==io.EOF{
打破
}
}
格式打印项次(字符串(目标))
}

因此,我知道输出是错误的,我实际上应该做
temp[:n]
来写入字节,但是看着输出,我意识到tmp缓冲区不会在每次迭代时都被清除,而且当n为1时,缓冲区的内容不应该是EL,我的意思是L被预先添加到tmp而不是追加。我看了一下Read函数,但不明白。有人能给我解释一下吗。

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

您的程序的正确版本为:

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

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

        if err == io.EOF {
            break
        }
    }