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