繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM