Go 的標準庫中有一些通用介面,例如io.Closer:
type Closer interface {
Close() error
}
如果我想在我的代碼中定義一個具有Close方法的介面,我會像這樣嵌入io.Closer:
type example interface {
io.Closer
// ... some other functions or embedded types
}
還是我只是定義函式本身,如:
type example interface {
Close() error
// ... some other functions or embedded types
}
有什么最佳做法嗎?
uj5u.com熱心網友回復:
對于這樣常見且簡單的介面,我肯定會嵌入標準庫中的介面(例如io.Closer,io.Reader和io.ByteReader)。
但不是任何介面型別。一般來說,介面應該在需要的地方定義。嵌入在其他包(包括標準庫)中定義的任何介面都有在更改或擴展時無法隱式實作它們的危險。
包的“所有者”(定義者)可能會更改它(例如用新方法擴展它)并正確更新實作它的所有型別,因此包可以繼續從外部作業,但顯然包所有者不會更新你的實作。
例如,介面型別在Go 1.0reflect.Type中沒有Type.ConvertibleTo()方法,它是在Go 1.1中添加的。同樣的事情也可能發生:標準庫中的介面可能會在未來的 Go 版本中被更改或擴展,導致您現有的代碼無法實作它們。
小型通用介面和“其余”之間有什么區別?介面越大,抽象越弱——Go 諺語也是如此。小介面喜歡io.Closer并io.Reader捕獲一個微小但重要的功能。它們是如此普遍,“每個”庫都試圖實作它們,每個實用函式都建立在它們之上。我從沒想過他們會改變。如果有理由更改/擴展它們,它們將被添加為新介面。不像更大的介面,抽象更難準確捕獲。隨著時間的推移,他們有更好的機會改變/發展。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/414527.html
標籤:
