2016-07-01 78 views
-1

我是Go的新手。想知道什麼是利益或缺點,當結構作爲與或不具有接口方法的接收器Go結構作爲方法接收器有和沒有接口

type DB struct 

func (db *DB) add(user User) {...//some code } 
func (db *DB) remove(user User) {..//some code} 

type UserAccess inferface { 
    func add(user User) 
    func remove(user User) 
} 

func (db *DB) add(user User) {...//some code } 
func (db *DB) remove(user User) {..//some code} 

請注意:上述例子只是把代碼中的東西。

我在問這個問題,我在github中看到很多使用空結構作爲方法接收器的Go庫代碼。

我知道幾乎所有的博客和go-guru位使用界面鼓。

但哪個地方,哪裏接口實際需要在執行lang?以及我們因此而失去或獲得什麼?

回答

0

在第一個示例中,DB或指向DB的指針可以充當接收者。在第二個例子中,使用一個接口,你仍然只能有一個DB或者作爲接收者的數據庫,但是沒有人需要知道(假設你的函數名字大寫爲Add和Remove)。相反,您可以使用可能是DB或& DB的接口,但可以是實現「添加」和「刪除」功能的任何其他接口。

這對於幾個原因非常有幫助。首先,這是更可測試的方法,因爲您可以使用接口的實現,但從不接觸數據庫。只要你正在測試的東西具有兩個具有匹配簽名的函數,就可以使用它。有嘲笑庫利用這個來自動生成代碼。其次,如果你使用一個接口,那麼你的調用者不需要知道任何關於實際類型的東西(在這個例子中是DB),它只能訪問在接口上定義的函數,而不是整個API你的類型。

在接口背後的好處和設計考慮因素中,還有許多其他很好的閱讀材料。