[英]Why is there no RuneWriter interface in Go's io package?
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 {
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编写者维护的标准软件包或其他软件包中使用。
您可以在自己的程序包或代码中定义接口。 这是一个非常有用的功能,对于Go来说有些独特。
只是Be Bop的答案的一小部分:
接口对于定义通用功能很有用。 例如func f(foo interface { Foo() })
表示类似“我是函数f,如果您给我可以使用Foo()的东西,我会做适当的工作。”
现在考虑像RuneScanner
这样的RuneScanner
。 RuneScanner
提供了非常简单的方法,尤其是UnreadRune
,这些方法无法通过“较低级别”的内容轻松模拟。
RuneWriter
界面有什么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编码流”。 这是一个很浅薄的承诺。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.