Go中复制文件最简洁高效的方式是用io.Copy配合os.Open和os.Create,自动流式拷贝、内存占用低;需错误处理与defer关闭,进阶可补充Chmod和Chtimes保留元信息。

使用 Go 语言复制文件最简洁、高效的方式是结合 io.Copy 和 os 包,无需手动读写缓冲区,底层自动处理流式拷贝,支持大文件且内存占用低。
打开源文件和目标文件
用 os.Open 打开源文件(只读),用 os.Create 或 os.OpenFile 创建/截断目标文件(可写)。注意检查错误,避免空指针或权限问题。
src, err := os.Open("source.txt")if err != nil { log.Fatal(err) }defer src.Close()dst, err := os.Create("dest.txt")if err != nil { log.Fatal(err) }defer dst.Close()
调用 io.Copy 完成拷贝
io.Copy 从源 io.Reader 读取数据,写入目标 io.Writer,内部使用默认 32KB 缓冲区,适合绝大多数场景。它返回实际拷贝字节数和可能的错误。
n, err := io.Copy(dst, src)- 成功时
err == nil,n为总字节数 - 若需校验,可对比
n与src.Stat().Size()
完整可运行示例
以下是一个带错误处理和资源清理的最小可行代码:
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"io"
"log"
"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() {
if err := copyFile("a.txt", "b.txt"); err != nil {
log.Fatal(err)
}
}
进阶建议:保留文件元信息
io.Copy 只复制内容,不保留修改时间、权限等。如需接近 cp -p 效果,可在拷贝后调用:
-
dst.Chmod(srcInfo.Mode())—— 复制权限(需先src.Stat()) -
dst.Chtimes(srcInfo.ModTime(), srcInfo.ModTime())—— 复制时间戳 - 注意:Windows 对 chmod 支持有限,部分模式会被忽略










