簡體   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