Types 为什么Go';中没有RuneWriter接口;s io包?

Types 为什么Go';中没有RuneWriter接口;s io包?,types,interface,go,io,Types,Interface,Go,Io,包含(除其他外)以下接口: type ByteReader interface { ReadByte() (c byte, err error) } type ByteScanner interface { ByteReader UnreadByte() error } type ByteWriter interface { WriteByte(c byte) error } type RuneReader interface

包含(除其他外)以下接口:

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缺少有什么原因吗?

Go作者根据需要定义接口。他们没有定义一个接口来填充可能的方法网格。此策略有助于保持标准库的小型化和简单化

我认为他们的结论是几乎不需要RuneWriter接口,因为他们在标准包或其他维护包中不需要它

Go团队之外没有对接口的需求。问题追踪器、邮件列表或irc频道的可用记录历史记录中没有对接口的请求

问题中引用的其他接口用于标准包或Go作者维护的其他包中


您可以在自己的包或代码中定义接口。这是一个非常有用的功能,在某种程度上是独一无二的。

只是对Bop答案的一个小小补充:

接口对于定义泛型函数很有用。例如,
func f(foo接口{foo()})
声明类似于“我是函数f,如果你给我一些可以foo()使用的东西,我会做正确的工作。”

现在考虑接口如<代码> RuneScanner < /代码>。

RuneScanner
提供了非平凡的方法,尤其是
UnreadRune
,它不能很容易地被“较低级别”的东西模拟

RuneWriter
接口有什么好处?定义一个函数
func g(rw runewwriter)
,它宣布自己是“给我一些可以写符文的东西,我会做好我的工作!”?但是没有真正的需要,因为这可以通过标准方法进行简单的模拟:将其定义为
func g(r io.Writer)
,只需在内部使用
fmt.Fprintf(r…
。 如果你想写符文,你必须能够写1到6(?)字节,这就是
io.Writer提供的功能。因此不需要
RuneWriter


通过引入
RuneWriter
,它会使代码更可读或更安全吗?可能不会:函数
func g(rw runewwriter)
明确表示只希望将符码写入其参数。这很好,但对编写更好的程序并没有真正的帮助。符文是1到6个字节,
g
做出的唯一额外承诺是“写入我的参数的任何内容都将是有效的UTF-8编码流”。这是一个非常肤浅的承诺。

如果您需要类似的东西,请在您自己的代码/包中定义它。在许多地方,标准软件包只定义他们使用/需要的东西,而不是一整套。据我所知,
bufio.Reader
是标准包中唯一可以实现
RuneWriter
(而且
bufio.Reader
还有许多其他方法,它们也不是任何接口的一部分)@DaveC:但他们不应该定义他们期望用户需要什么,而不仅仅是他们自己需要什么吗?这意味着猜测任何地方的用户可能需要什么。接口很容易根据需要定义。在io包中添加
RuneWriter
没有任何帮助,如果您想在代码中调用类似
WriteRune
的东西,您可以a)创建自己的接口并将其作为参数接受,或者b)使用
io.Reader
参数,如果您自己的接口的类型断言失败,则将其包装为
bufio.Reader
。由于bufio.Reader是标准包中唯一实现它的东西(a)有效地强制调用方使用bufio.Reader(或他们自己的类似版本)。Go的作者没有看到对RuneWriter接口的需求。这就是我的问题:为什么他们没有看到这种需求?“标准包或他们维护的任何subrepo包中都不需要它。”但ByteWriter也不需要。是的,我可以定义自己的接口,但在标准库中使用它的好处在于,与所有第三方库都必须定义自己的库相比,它使第三方库彼此更加兼容。但是,要使接口兼容,不必使用相同的名称。我可以执行
类型Foobar接口{Read([]字节)(int,error)}
,我的Foobar接口可以与
io.Reader
或任何其他等效接口完全交互操作(例如,我可以生成接收或返回我的接口的函数,其他函数可以传递或分配给
io.Reader
)。重要的是方法签名,而不是接口本身。ByteWriter用于标准库中的四到五个位置。同样,请参阅标准库中定义特殊接口的位置示例(如我前面给出的压缩包示例)。“标准化”这类接口集是毫无意义的。