io

type Reader interface {
    Read(p []byte) (n int, err error)
}

type Writer interface {
    Write(p []byte) (n int, err error)
}

// 多了偏移量
type ReaderAt interface {
    ReadAt(p []byte, off int64) (n int, err error)
}

type WriterAt interface {
    WriteAt(p []byte, off int64) (n int, err error)
}

type ReaderFrom interface {
    ReadFrom(r Reader) (n int64, err error)
}

type WriterTo interface {
    WriteTo(w Writer) (n int64, err error)
}

type Seeker interface {
    Seek(offset int64, whence int) (ret int64, err error)
}

type Closer interface {
    Close() error
}

实现了 io.Reader 接口或 io.Writer 接口的类型

  • os.File 同时实现了 io.Reader 和 io.Writer
  • strings.Reader 实现了 io.Reader
  • bufio.Reader/Writer 分别实现了 io.Reader 和 io.Writer
  • bytes.Buffer 同时实现了 io.Reader 和 io.Writer
  • bytes.Reader 实现了 io.Reader
  • compress/gzip.Reader/Writer 分别实现了 io.Reader 和 io.Writer
  • crypto/cipher.StreamReader/StreamWriter 分别实现了 io.Reader 和 io.Writer
  • crypto/tls.Conn 同时实现了 io.Reader 和 io.Writer
  • encoding/csv.Reader/Writer 分别实现了 io.Reader 和 io.Writer
  • mime/multipart.Part 实现了 io.Reader
  • net/conn 分别实现了 io.Reader 和 io.Writer(Conn接口定义了Read/Write)

文件读取

  1. 读取小文件

    func ReadAll(filePath string) ([]byte, error) {
    
       // f 是 os.File
       f, err := os.Open(filePath)
       if err != nil {
          return nil, err
       }
       return ioutil.ReadAll(f)
    }
    

    或者使用 ioutil

    data, err := ioutil.ReadAll(filename)
    
  2. 逐行读取

    func ReadLines(filePath string) error {
      f, err := os.Open(filePath)
      if err != nil {
              fmt.Println(err.Error())
              return err
      }
    
      defer f.Close()
    
      reader := bufio.NewReader(f)
      for {
              line, err := reader.ReadBytes('\n')
              fmt.Print(string(line))
              if err != nil {
                      if err == io.EOF {
                              return nil
                      }
                      return err
              }
      }
    }