io.Copy是Go语言中高效处理文件传输的核心方法,通过流式读写避免内存溢出,适用于大文件复制、HTTP下载等场景。它使用固定缓冲区循环读取源数据并写入目标,支持任意实现io.Reader和io.Writer的类型。典型应用包括本地文件复制与网络下载,如结合os.File和http.Response.Body进行边读边写。可通过io.CopyBuffer自定义缓冲区大小优化性能,或包装Reader实现进度追踪与限速控制,显著提升程序稳定性与传输效率。

在Go语言中,io.Copy 是实现文件高效传输的核心方法之一。它能够以最小的内存开销完成数据复制,适合处理大文件或网络传输场景。相比一次性读取整个文件到内存,io.Copy 采用流式读写,避免内存溢出,提升性能。
io.Copy(dst, src) 函数定义在 io 包中,用于将数据从一个源(src)复制到目标(dst),两者都需实现 io.Reader 和 io.Writer 接口。函数内部使用固定大小的缓冲区(通常32KB)循环读写,无需加载整个文件到内存。
典型应用场景包括:
以下代码展示如何使用 io.Copy 高效复制本地文件:
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"io"
"os"
)
func copyFile(srcPath, dstPath string) error {
src, err := os.Open(srcPath)
if err != nil {
return err
}
defer src.Close()
dst, err := os.Create(dstPath)
if err != nil {
return err
}
defer dst.Close()
_, err = io.Copy(dst, src)
return err
}
func main() {
err := copyFile("source.txt", "destination.txt")
if err != nil {
panic(err)
}
}
说明:
结合 net/http,可实现高效文件下载:
package main
import (
"io"
"net/http"
"os"
)
func downloadFile(url, filepath string) error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
file, err := os.Create(filepath)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(file, resp.Body)
return err
}
resp.Body 是 io.ReadCloser(实现了 io.Reader),直接作为源传入 io.Copy,边下载边写入磁盘,节省内存。
虽然 io.Copy 默认性能良好,但在特定场景下可进一步优化:
例如使用自定义缓冲区:
buf := make([]byte, 64*1024) // 64KB buffer _, err := io.CopyBuffer(dst, src, buf)
基本上就这些。io.Copy 简洁、高效、通用,是Golang中处理文件传输的推荐方式,合理使用能显著提升程序稳定性与性能。
以上就是Golang使用io.Copy高效传输文件示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号