這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
以我自己的項目為例,項目的目錄結構是這樣的:
1、我有兩個項目,一個項目做為基礎項目,裡面的方法大都具有通用性。
2、還有一個正在開發的項目,這個項目需要調用基礎項目裡的很多函數。
現在基礎項目裡有一個包含所有對資料庫進行操作的函數的檔案,名叫servicebase.go,包名:db
代碼如下:
packaeg db
typeServiceBasestruct{
DBE *xorm.Engine
}
在正在開發的項目裡我建了一個baseservice.go(包名:base)這個檔案,這個檔案裡面的函數也都具有通用性,它作為一個基礎函數庫供我當前項目調用,就是說裡面的函數不是為了某一個模組設計的,而是在項目中很多模組都需要用到的函數。
現在我讓baseservice去繼承ServiceBase ,代碼如下:
package base
typeBaseServicestruct{
ServiceBase
}
這樣一來,baseservice就繼承了ServiceBase 包裡面的函數,當你取得了指向BaseService的指標的時候,就可以通過指標調用ServiceBase和BaseService裡面的函數了。
這不是重點,重點是這個項目的其他模組的service也應該來繼承BaseService ,代碼如下:
package foodsafety
typeFoodSafetyServicestruct{
BaseService
}那麼為什麼要這樣做呢?因為其他模組如果繼承了baseservice,就同時繼承了servicebase,指向foodsafetyservice這個結構體的指標就可以同時調用servicebase、baseservice和foodsafetyservice這三個模組裡的函數。注意:如果這三個檔案裡有同名的函數,用指向foodsafetyservice的指標調用這個同名函數的時候,系統會調用foodsafetyservice這個檔案裡的函數,這就和物件導向中的函數重寫一樣。
那又有人要問了,就算是這樣那又怎麼樣呢?
這樣做有以下幾個好處:
1、如果你的foodsafetyservice包含的是servicebase,那麼當你需要調用當前項目某個公用函數的時候,是不是需要取得指向baseservice的指標,然後再用這個指標去
調用公用函數。但是如果你的foodsafetyservice包含的是baseservice,這一步就可以省略了,這在一定程度上可以簡化程式的代碼。
2、項目的階層更加清楚。