为什么Go的io包中没有RuneWriter接口?

时间:2015-03-17 16:10:16

标签: types interface go io

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缺失的原因?

2 个答案:

答案 0 :(得分:4)

Go作者根据需要定义接口。它们没有定义接口以填充可能方法的网格。此政策有助于保持标准库的简洁。

我认为他们认为RuneWriter界面几乎没有必要,因为他们在标准包或他们维护的其他包中不需要它。

对Go团队以外的界面没有任何需求。问题跟踪器,邮件列表或irc频道的可用录制历史记录中没有对该接口的请求。

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

您可以在自己的包或代码中定义接口。这是一个非常有用的功能,对Go来说有点独特。

答案 1 :(得分:2)

Be Bop的回答只是一小部分:

接口对于定义泛型函数很有用。例如。 func f(foo interface { Foo() })陈述类似“我是函数f,如果你给我一些我可以Foo()的东西,我会做一个合适的工作。”

现在考虑像RuneScanner这样的接口。 RuneScanner提供了非常重要的方法,尤其是UnreadRune,这些方法无法通过“较低级别”的内容轻松模拟。

RuneWriter界面有什么用处?定义一个函数func g(rw RuneWriter),宣称自己是“给我一些我可以写符文的东西,我会完成我的工作!” ?但是没有必要,因为这可以通过标准方法琐事模拟:将其定义为func g(r io.Writer)并在内部使用fmt.Fprintf(r ...)。 如果你想编写符文,你必须能够编写1到6个(?)字节,这就是io.Writer提供的。所以不需要RuneWriter

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