golang复制函数理解
嘿,伙计们,我在玩一些缓冲区,我只是写了一些代码来理解Read()是如何工作的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
主程序包
进口(
“字节”
“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
}
}