package main import ( "errors" "fmt" "io" "os" ) // PrefixReader 自定义Reader,读取固定前缀数据 type PrefixReader struct { data []byte offset int // 读取偏移量 } // NewPrefixReader 创建自定义Reader实例 func NewPrefixReader(s string) *PrefixReader { return &PrefixReader{ data: []byte(s), } } // Read 实现io.Reader接口 func (r *PrefixReader) Read(p []byte) (int, error) { if r.offset >= len(r.data) { return 0, io.EOF } n := copy(p, r.data[r.offset:]) r.offset += n return n, nil } func main() { // 初始化自定义Reader reader := NewPrefixReader("Go IO Reader 最佳实践") buf := make([]byte, 16) // 打开文件写入自定义Reader读取的数据 file, err := os.Create("io/reader.txt") if err != nil { fmt.Printf("创建文件失败: %v\n", err) return } defer file.Close() // 流式读取并写入文件 for { n, err := reader.Read(buf) if err == io.EOF { break } if err != nil { errors.New("读取失败") return } _, _ = file.Write(buf[:n]) } fmt.Println("自定义Reader读写完成") }