英文:
bytes.Reader, replacing underlying []byte array
问题
我一直在尝试找到一种好的方法来传递一个Reader接口{},而不必重新创建与io.Reader相关联的方法。
这是我正在使用的代码:
type EZReader struct {
data *bytes.Reader
}
func (self *EZReader) Replace(input []byte) {
self.data = bytes.NewReader(input)
}
func (self *EZReader) Read(p []byte) (n int, err error) {
return self.data.Read(p)
}
感觉不太对,有没有更好的方法呢?
我的想法是,我可以将这个io.Reader传递给一个函数,并在需要时更换底层数组,而不必重新分配要使用它的对象,例如json解码器。
英文:
I've been trying to find a nice way to hand off a Reader interface{} without recreating the methods associated with a io.Reader.
This is what I'm using:
type EZReader struct {
data *bytes.Reader
}
func (self *EZReader) Replace(input []byte) {
self.data = bytes.NewReader(input)
}
func (self *EZReader) Read(p []byte) (n int, err error) {
return self.data.Read(p)
}
It feels, not right, is there a better way to do this?
The idea is I can then hand off this io.Reader to a function and change out the underlying array as
I need it without having to reallocating the object that wants to use it, in this case the json decoder.
答案1
得分: 1
如果在结构体中嵌入一个字段,那么该字段的所有方法也可以在结构体上调用。因此,如果你这样写:
type EZReader struct {
*bytes.Reader
}
你就不需要重新实现Read()
方法。这样的字段的行为就像它被命名为Reader
一样。请注意,你无法通过这种方式避免暴露该字段。
英文:
If you embed a field in a struct, all the methods of that field can be called on the struct, too. So if you write
type EZReader struct {
*bytes.Reader
}
you don't have to reimplement Read()
. Such a field behaves as if it was named Reader
. Notice that you can't avoid exposing the field this way.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论