欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CodeMonkey流水账:Road of Go:io.Copy

程序员文章站 2022-06-16 21:10:05
...

(一)Go不需要用buffer循环拷贝

我们用C或者Java拷贝数据,通常都是申请一块缓存,拷贝来源,写入目标。
解压/压缩文件同理,只是来源或目标换成压缩类的流。
像下面的:

byte[] buf=new byte[bufferSize];
while ((num = fin.read(buf,0,buf.length)) != -1){
	fout.write(buf,0,num);
}

但Go不用这么麻烦,可以直接用io.copy拷贝,如下:

_, err = io.Copy(fout, fin)

(二) 用缓存就别忘记Flush

如下:如果你用了io.copy,写入的是bufio的Writer,就得小心了。

bfout := bufio.NewWriter(fout)
_, err = io.Copy(fout, fin)
bfout.Flush()

如果是Java或者C++,我记得没有调Flush缓存也只是没有立即写入磁盘文件而已,然鹅最终还是会写入的。但是go比较神奇,你不调Flush又用io.Copy,那么最后一块缓存(缺省4kb)就不会写入文件。于是就会少拷贝/解压一小部分内容,神奇。。。