在Go中使用读/写文件的正确方法

问题描述

例如,我有这种类型:

type Matrix [][]int

还有一个类似这样的文件,其中包含Matrix数据:

Lines: 2
Columns: 3
1 2 3
4 5 6

在Go中保存/加载类似内容的正确方法是什么?如何利用阅读器/书写器界面? Os不是用例吗?我只能想到这一点:

func (m *Matrix) Read(filename byte[]) (n int,err error) {
  data,_ := IoUtil.ReadFile(filename)
  // Parse data using split,etc and modify "m"
  return len(data),nil
}

func (m *Matrix) Write(filename byte[]) (n int,err error) {
  b := strings.Builder()
  // Get the data from "m" and populate the builder

  IoUtil.WriteFile(filename,b.String(),0666)
  return len(data),nil
}

但这看起来不对,因为我没有利用接口或os.File类型(它是Reader),并且我需要已经创建一个Matrix实例来填充它。如何正确执行?

解决方法

io.Reader和io.Writer是字节流上的读写接口。您需要在字节流上编码和解码矩阵的函数。

使用Matrix包中的io.Reader和io.Writer接口,而不是实现这些接口。将实现留给* os.File等。

通常在读取值时编写构造函数:

// ReadMatrix creates a new Matrix from the data in r.
func ReadMatrix(r io.Reader) (*Matrix,error) {
  var m Matrix
  data,_ := ioutil.ReadAll(r)
  // Parse data using split,etc and modify "m"
  return &m,nil
}

...并提供一种编写方法:

// Write writes the contents of the matrix to w.
// Use ReadMatrix to read the data in the format 
// written by Write.
func (m *Matrix) Write(w io.Writer) error {
  bw := bufio.NewWriter(w)
  // Get the data from "m" and write to bw.
  return bw.Flush()
}