【发布时间】:2015-05-20 04:19:53
【问题描述】:
Go's io package 包含(除其他外)以下接口:
type ByteReader interface {
ReadByte() (c byte, err error)
}
type ByteScanner interface {
ByteReader
UnreadByte() error
}
type ByteWriter interface {
WriteByte(c byte) error
}
type RuneReader interface {
ReadRune() (r rune, size int, err error)
}
type RuneScanner interface {
RuneReader
UnreadRune() error
}
但是没有RuneWriter接口:
type RuneWriter interface {
WriteRune(r rune) (size int, err error)
}
RuneWriter 丢失是否有原因?
【问题讨论】:
-
如果你需要类似的东西,那么在你自己的代码/包中定义它。在许多地方,标准包只定义了他们使用/需要的东西,而不是完整的一套。据我所知,
bufio.Reader是标准包中唯一可以实现RuneWriter的东西(bufio.Reader有许多其他方法也不属于任何接口)。 -
@DaveC:但他们不应该定义他们期望用户需要什么,而不仅仅是他们自己需要什么吗?
-
这意味着猜测任何地方的任何用户可能需要什么。接口很容易根据需要定义。将
RuneWriter添加到 io 包中没有任何帮助。 -
正如我所说,如果你的代码中有一个地方你想调用类似
WriteRune的东西,你可以a)制作你自己的接口并接受它作为参数或b)接受io.Reader参数,如果对您自己的接口的类型断言失败,则将其包装为bufio.Reader。由于 bufio.Reader 是标准包中唯一实现它的东西(a)有效地强制调用者包装在 bufio.Reader (或他们自己的类似版本)。 -
例如看看像compress/flate.NewReader 这样的东西just that。