var EOF = errors.New("EOF")
var ErrClosedPipe = errors.New("io: read/write on closed pipe")
var ErrNoProgress = errors.New("multiple Read calls return no data or error")
var ErrShortBuffer = errors.New("short buffer")
var ErrShortWrite = errors.New("short write")
var ErrUnexpectedEOF = errors.New("unexpected EOF")
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
type Closer interface {
Close() error
}
============================如下3个经常配合使用==============================
type Seeker interface {
Seek(offset int64, whence int) (int64, error)
}
type WriterAt interface {
WriteAt(p []byte, off int64) (n int, err error)
}
type ReaderAt interface {
ReadAt(p []byte, off int64) (n int, err error)
}
type ByteReader interface {
ReadByte() (c byte, err error)
}
type ByteScanner interface {
ByteReader
UnreadByte() error
}
func main() {
var s bytes.Buffer
s.Write([]byte("haha"))
bytebuf, _ := s.ReadByte()
fmt.Println(string(bytebuf))
bytebuf, _ = s.ReadByte()
fmt.Println(string(bytebuf))
s.UnreadByte()
bytebuf, _ = s.ReadByte()
fmt.Println(string(bytebuf))
bytebuf, _ = s.ReadByte()
fmt.Println(string(bytebuf))
}
type RuneReader interface {
ReadRune() (r rune, size int, err error)
}
type RuneScanner interface {
RuneReader
UnreadRune() error
}
type ByteWriter interface {
WriteByte(c byte) error
}
type ReaderFrom interface {
ReadFrom(r Reader) (n int64, err error)
}
type WriterTo interface {
WriteTo(w Writer) (n int64, err error)
}
==========================实例=================================================
func main() {
var buff bytes.Buffer
var buff1 bytes.Buffer
fp, err := os.OpenFile("E:/a.txt", os.O_RDWR, 6)
if err != nil {
fmt.Println("open err", err)
}
defer fp.Close()
n,err:=buff.ReadFrom(fp)
fmt.Println(n)
fmt.Println(string(buff.Bytes()))
buff.WriteTo(&buff1)
fmt.Println(string(buff1.Bytes()))
}
官方解释:LimitedReader从R中读取数据,但限制可以读取的数据的量为最多N字节,每次调用Read方法都会更新N以标记剩余可以读取的字节数。
type LimitedReader struct {
R Reader
N int64
}
func LimitReader(r Reader, n int64) Reader
func (l *LimitedReader) Read(p []byte) (n int, err error)
=============================实例=====================================
func main() {
var buff bytes.Buffer
buff.WriteString("hahaha")
LimitReader:=io.LimitReader(&buff,2)
p:=make([]byte,1024)
n,_:=LimitReader.Read(p)
fmt.Println(n)
fmt.Println(string(p[:n]))
}
type SectionReader struct {
}
func NewSectionReader(r ReaderAt, off int64, n int64) *SectionReader
func (s *SectionReader) Size() int64
func (s *SectionReader) Read(p []byte) (n int, err error)
func (s *SectionReader) ReadAt(p []byte, off int64) (n int, err error)
func (s *SectionReader) Seek(offset int64, whence int) (int64, error)
func main() {
fp, err := os.OpenFile("E:/a.txt", os.O_RDWR, 6)
if err != nil {
fmt.Println("open err", err)
}
defer fp.Close()
SectionReader := io.NewSectionReader(fp, 1, 3)
n := SectionReader.Size()
fmt.Println(n)
p := make([]byte, 1024)
n1, _ := SectionReader.Read(p)
fmt.Println(string(p[:n1]))
n3, _ := SectionReader.Seek(2, io.SeekStart)
m := make([]byte, 1024)
n4, _ := SectionReader.ReadAt(m, n3)
fmt.Println(string(m[:n4]))
}
官方解释:Pipe创建一个同步的内存中的管道。它可以用于连接期望io.Reader的代码和期望io.Writer的代码。一端的读取对应另一端的写入,直接在两端拷贝数据,没有内部缓冲。可以安全的并行调用Read和Write或者Read/Write与Close方法。Close方法会在最后一次阻塞中的I/O操作结束后完成。并行调用Read或并行调用Write也是安全的:每一个独立的调用会依次进行。
func Pipe() (*PipeReader, *PipeWriter)
type PipeReader struct {
}
func (r *PipeReader) Read(data []byte) (n int, err error)
func (r *PipeReader) Close() error
func (r *PipeReader) CloseWithError(err error) error
type PipeWriter struct {
}
func (w *PipeWriter) Write(data []byte) (n int, err error)
func (w *PipeWriter) Close() error
func (w *PipeWriter) CloseWithError(err error) error
func main() {
buff1, buff2 := io.Pipe()
p := make([]byte, 1024)
for i := 0; i < 10; i++ {
go buff2.Write([]byte("hahahhaha"+strconv.Itoa(i)))
}
for i := 0; i < 10; i++ {
n, _ := buff1.Read(p)
fmt.Println(string(p[:n]))
}
for{
;
}
}
func TeeReader(r Reader, w Writer) Reader
func main() {
var buff bytes.Buffer
var buff1 bytes.Buffer
buff1.Write([]byte("hahhaha"))
buff.Write([]byte("xixixixixixixi"))
p:=make([]byte,1024)
buff2:=io.TeeReader(&buff1,&buff)
n,_:=buff2.Read(p)
fmt.Println(string(p[:n]))
fmt.Println(string(buff.Bytes()))
}
func MultiReader(readers ...Reader) Reader
func MultiWriter(writers ...Writer) Writer
func Copy(dst Writer, src Reader) (written int64, err error)
func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
func ReadFull(r Reader, buf []byte) (n int, err error)
func WriteString(w Writer, s string) (n int, err error)