我理解Go接口的一般概念.但是,我最近正在考虑实现io.Reader
界面,这让我很困惑.我发现这篇文章并没有多大帮助.
首先,接受的答案是使用io.Reader
的Read
功能,据我可以告诉永远不会实现.其次,该Read
功能如何在类似的情况下工作ioutil.ReadAll
.它需要一些实现io.Reader
接口并返回一片字节的东西.我不明白是什么东西只返回一个int
并且err
可以被处理成一片字节.
编辑:
我在疯狂的IRC频道得到了帮助,这就是你如何实际实现一个http://play.golang.org/p/ejpUVOx8jR的答案.非常感谢go社区.
编辑2:
如下所述,在strign大于缓冲区的情况下,上述实现将失败.这是一个更健全的实现http://play.golang.org/p/t4Zg8TnF33.
小智 8
tez 提供的更新答案完全有效,但这里有一个我认为使用 Go 的更干净的替代方案copy
:
type Reader struct {
data []byte
readIndex int64
}
func (r *Reader) Read(p []byte) (n int, err error) {
if r.readIndex >= int64(len(r.data)) {
err = io.EOF
return
}
n = copy(p, r.data[r.readIndex:])
r.readIndex += int64(n)
return
}
Run Code Online (Sandbox Code Playgroud)
通过使用copy
,您不必担心溢出p []byte
。这也不会耗尽/破坏您的阅读器上的任何状态,而只是使用readIndex
.
完整示例在这里: https: //play.golang.org/p/8QTECCkies
这种策略可以在 Go 的一些核心包中看到(即https://golang.org/src/strings/reader.go)