问题描述
例如,我有这种类型:
type Matrix [][]int
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()
}