if err != io.EOF { //忽略 EOF 错误
log.Fatal("[F]", err)
}
}
fmt.Printf("读取字符 "%s", 长度为 %d byten", p, len(p))
}
读取字符 "Go", 长度为 2 byte
读取字符 "是一种令人愉悦的编程语言 ", 长度为 50 byte
三、io.ReaderAt 和 os.WriterAt
定义(off 是 offset 的缩写):
type ReaderAt interface {
ReadAt(p []byte, off int64) (n int, err error)
}
type WriterAt interface {
WriteAt(p []byte, off int64) (n int, err error)
}
ReadAt() 从基本输入源的偏移量 off 处开始,其他和 Read() 一样;
WriteAt() 从基本输入源的偏移量 off 处开始,其他和 Write() 一样。
示例:
func at() {
f, _ := os.Create("at.txt")
defer f.Close()
f.WriteString("Go是一种令人愉悦的编程语言")
f.WriteAt([]byte("程序"), 26) //偏移 26byte 改写“编程”->“程序”
fi, _ := f.Stat() //获取文件信息
p := make([]byte, fi.Size()-2) //文件大小减去偏移值
f.ReadAt(p, 2) //偏移 2 byte
os.Stdout.Write(p)
}
四、io.ReaderFrom 和 os.WriterTo
定义:
type ReaderFrom interface {
ReadFrom(r Reader) (n int64, err error)
}
type WriterTo interface {
WriteTo(w Writer) (n int64, err error)
}
ReadFrom() 从 r 中读取数据,直到 EOF 或发生错误。返回读取的字节数和 io.EOF 之外的其他错误。ReadFrom不会返回EOF错误
WriteTo() 将数据写入 w 中,直到没有数据可写或发生错误。返回写入的字节数和任何错误。
示例:
func fromTo() {
r := strings.NewReader("Go是一种令人愉悦的编程语言") //创建一个 Reader
w := bufio.NewWriter(os.Stdout) //创建一个 Writer
w.ReadFrom(r) // w 一次性读取 r 的全部内容
w.Flush()
r.Seek(0, os.SEEK_SET) //重置指针
r.WriteTo(w) // r 一次性将内容写入 w 中
w.Flush()
}
五、io.Seeker
定义:
type Seeker interface {
Seek(offset int64, whence int) (ret int64, err error)
}
Seek 设置下一次 Read 或 Write 的偏移量(offset),它的解释取决于 whence。示例见上文。
whence的值,在os包中定义了相应的常量:
SEEK_SET int = 0 //从文件的起始处开始设置 offset










