package main
import (
"fmt"
"io"
"os"
)
func copyFile(src, dst string) error {
srcFile, err := os.Open(src)
if err != nil {
return err
}
defer srcFile.Close()
dstFile, err := os.Create(dst)
if err != nil {
return err
}
defer dstFile.Close()
_, err = io.Copy(dstFile, srcFile)
if err != nil {
return err
}
return nil
}
io
包主要接口和函数作用解释:
io.Reader
接口:
type Reader interface {
Read(p []byte) (n int, err error)
}
- 作用:该接口表示可以从其读取数据的对象。
Read
方法将数据读入字节切片p
,返回读取的字节数n
和可能的错误err
。当读到文件末尾时,err
通常为io.EOF
。在上述代码中,os.Open
返回的*os.File
类型实现了io.Reader
接口,因此srcFile
可以作为io.Copy
的源数据读取对象。
io.Writer
接口:
type Writer interface {
Write(p []byte) (n int, err error)
}
- 作用:该接口表示可以向其写入数据的对象。
Write
方法将字节切片p
中的数据写入,返回写入的字节数n
和可能的错误err
。在上述代码中,os.Create
返回的*os.File
类型实现了io.Writer
接口,因此dstFile
可以作为io.Copy
的目标数据写入对象。
io.Copy
函数:
func Copy(dst Writer, src Reader) (written int64, err error)
- 作用:
io.Copy
函数从实现了io.Reader
接口的src
读取数据,并将其写入实现了io.Writer
接口的dst
。它会持续读取和写入,直到在src
上遇到io.EOF
或者发生错误。返回值written
表示成功写入的字节数,err
表示可能发生的错误。在上述代码中,io.Copy
函数实现了从源文件到目标文件的数据复制。