7.15. 一些建議

當設計一個新的包時,新手Go程序員總是先創建一套接口,然後再定義一些滿足它們的具體類型。這種方式的結果就是有很多的接口,它們中的每一個僅只有一個實現。不要再這麼做了。這種接口是不必要的抽象;它們也有一個運行時損耗。你可以使用導出機制(§6.6)來限制一個類型的方法或一個結構體的字段是否在包外可見。接口只有當有兩個或兩個以上的具體類型必須以相同的方式進行處理時才需要。

當一個接口只被一個單一的具體類型實現時有一個例外,就是由於它的依賴,這個具體類型不能和這個接口存在在一個相同的包中。這種情況下,一個接口是解耦這兩個包的一個好方式。

因為在Go語言中只有當兩個或更多的類型實現一個接口時才使用接口,它們必定會從任意特定的實現細節中抽象出來。結果就是有更少和更簡單方法的更小的接口(經常和io.Writer或 fmt.Stringer一樣只有一個)。當新的類型出現時,小的接口更容易滿足。對於接口設計的一個好的標準就是 ask only for what you need(只考慮你需要的東西)

我們完成了對方法和接口的學習過程。Go語言對面向對象風格的編程支持良好,但這並不意味著你只能使用這一風格。不是任何事物都需要被當做一個對象;獨立的函數有它們自己的用處,未封裝的數據類型也是這樣。觀察一下,在本書前五章的例子中像input.Scan這樣的方法被調用不超過二十次,與之相反的是普遍調用的函數如fmt.Printf。