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

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没有缺少的原因?


喵喔喔
浏览 186回答 2
2回答

慕婉清6462132

Go 作者根据需要定义接口。它们没有定义用于填充可能方法网格的接口。此策略有助于保持标准库小而简单。我认为他们的结论是几乎不需要 RuneWriter 接口,因为他们在标准包或他们维护的其他包中不需要它。Go 团队之外没有对界面的需求。问题跟踪器、邮件列表或 irc 频道的可用记录历史记录上没有对接口的请求。问题中引用的其他接口用于标准包或Go作者维护的其他包。您可以在自己的包或代码中定义接口。这是一个非常有用的功能,对于 Go 来说有些独特。

慕雪6442864

只是 Be Bop 答案的一个小补充:接口对于定义通用函数很有用。例如,func f(foo interface { Foo() })声明诸如“我是函数 f,如果你给我一些我可以使用 Foo() 的东西,我会做一份合适的工作。”现在考虑像RuneScanner. ARuneScanner提供了非平凡的方法,尤其是UnreadRune“低级”的东西不能轻易模拟的方法。将一个什么RuneWriter接口是很好的?定义一个函数func g(rw RuneWriter),它宣布自己为“给我一些我可以写符文的东西,我会做我的工作!” ? 但是没有真正的需要,因为这可以通过标准方式简单地模拟:将其定义为func g(r io.Writer)并在fmt.Fprintf(r ...)内部使用。如果你想写符文,你必须有能力写 1 到 6 (?) 个字节,这就是 anio.Writer提供的。所以不需要一个RuneWriter.通过引入 ,它会使代码更具可读性或更安全RuneWriter吗?可能不是:一个函数func g(rw RuneWriter)明确声明它只希望将符文写入其参数。这很好,但对编写更好的程序没有真正的帮助。一个符文是 1 到 6 个字节,唯一的附加承诺g是“写入我的参数的任何内容都将是有效的 UTF-8 编码流”。这是一个非常肤浅的承诺。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go