我最近发现了这个很酷的界面io.WriterTo
:
https://godocs.io/io#WriterTo
我想为一些JSON对象实现它。我可以这样做:
package calendar
import (
"bytes"
"encoding/json"
"io"
)
type date struct {
Month int
Day int
}
func (d date) WriteTo(w io.Writer) (int64, error) {
buf := new(bytes.Buffer)
err := json.NewEncoder(buf).Encode(d)
if err != nil {
return 0, err
}
return buf.WriteTo(w)
}
但我认为这并不理想,因为它会在内存中复制对象,然后发送到Writer。是否可以直接写入,但也知道写入了多少字节?
2条答案
按热度按时间pqwbnv8z1#
若要直接写入,请创建一个io.Writer Package 器来计算写入的字节数:
更改WriteTo方法以编码为编写器,其中编写器是参数的 Package 。完成后返回字节计数和错误。
Run an example on the the Go PlayGround
ohfgkhjo2#
有没有可能直接写,而且还知道写了多少字节?
巧合的是,这也是《Go语言》一书中练习7.2的内容,这个练习包含了一个函数的实现过程,其签名为:
返回的指向
int64
的指针必须随时包含写入返回的io.Writer
的字节数。本质上,返回的io.Writer
是decorator,因为它通过更新字节计数器增强了初始io.Writer
的功能。首先,让我们创建类型
writerFunc
,它与io.Writer
的唯一方法Write
具有相同的参数化:然后,在
writerFunc
上定义方法Write(p []byte) (int, error)
:这样,
writerFunc
满足io.Writer
,并且充当任何func([]byte) (int, error)
到io.Writer
的适配器-也就是说,每当需要io.Writer
时,我们可以将func([]byte) (int, error)
Package 到writerFunc
中。最后,我们正在寻找的
CountingWriter
装饰函数:注意最后一条
return
语句:闭包writeAndCount
被 Package 在一个writerFunc
中。这是有效的,因为闭包的类型也是func([]byte) (int, error)
。正如我们在上面看到的,writerFunc
满足io.Writer
,这个函数的调用者最终会收到它。