在Go语言(Golang)中,ReadFrom
是 io.ReaderFrom
接口的一个方法,它允许从任意 io.Reader
接口读取数据直到EOF,并写入到实现了 io.ReaderFrom
接口的对象中。这通常用于高效地将数据从一个源复制到另一个源。
io.ReaderFrom
接口定义如下:
type ReaderFrom interface {
ReadFrom(r Reader) (n int, err error)
}
这里的 ReadFrom
方法接受一个实现了 io.Reader
接口的参数 r
,并将数据从这个 r
读取到当前对象中。n
返回读取的字节数,err
返回可能发生的错误。
下面是一个简单的例子,演示如何使用 ReadFrom
:
package main
import (
"fmt"
"io"
"os"
)
type MyReaderFrom struct{}
func (m MyReaderFrom) ReadFrom(r io.Reader) (int, error) {
dest := make([]byte, 1024)
totalRead := int(0)
for {
n, err := r.Read(dest)
if err != nil && err != io.EOF {
return totalRead, err
}
if n == 0 {
break
}
totalRead += int(n)
fmt.Printf("Read %d bytes\n", n)
}
return totalRead, nil
}
func main() {
src, err := os.Open("input.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer src.Close()
dst := MyReaderFrom{}
bytesRead, err := dst.ReadFrom(src)
if err != nil {
fmt.Println("Error reading from source:", err)
return
}
fmt.Printf("Total bytes read: %d\n", bytesRead)
}
在这个例子中,我们定义了一个 MyReaderFrom
结构体,并实现了 ReadFrom
方法。在 main
函数中,我们打开了一个文件作为数据源,然后使用 MyReaderFrom
实例从文件中读取数据。
注意,ReadFrom
方法通常用于那些需要直接从底层系统(如文件系统、网络等)高效读取数据的场景。它避免了不必要的数据复制,因为它直接将数据写入目标对象,而不是先读取到一个缓冲区然后再写入。