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
缺失的原因?
答案 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编码流”。这是一个非常浅薄的承诺。