本文探討在go語言中,如何使用工廠模式定義公共接口,以處理不同接口中相同方法的不同參數類型。 這個問題的挑戰在于,多個接口實現相同的方法,但這些方法的參數類型各不相同,直接使用Interface{}或any類型會丟失類型信息,降低代碼安全性。
假設我們有兩個接口IAXX和IBXX,它們都包含Create方法,但Create方法的參數類型分別為model.AXX和model.BXX。 為了定義一個公共接口ICommonInterface,同時避免類型丟失,我們可以采用工廠模式。
核心思路是創建一個ICreatorFactory接口,負責創建和提供不同類型的方法參數。 ICreator接口的Create方法接受ICreatorFactory作為參數,從而間接地接受不同類型的參數。
代碼示例:
立即學習“go語言免費學習筆記(深入)”;
package main import "fmt" // 定義模型類型 (假設) type modelAXX struct { Value string } type modelBXX struct { Value int } // 定義工廠接口 ICreatorFactory type ICreatorFactory interface { GetCreatePayload() interface{} } // 定義公共接口 ICreator type ICreator interface { Create(factory ICreatorFactory) } // IAXX 接口實現 type IAXX struct{} func (ia *IAXX) Create(factory ICreatorFactory) { payload := factory.GetCreatePayload().(modelAXX) // 類型斷言 fmt.Printf("IAXX Create: %+vn", payload) } // IBXX 接口實現 type IBXX struct{} func (ib *IBXX) Create(factory ICreatorFactory) { payload := factory.GetCreatePayload().(modelBXX) // 類型斷言 fmt.Printf("IBXX Create: %+vn", payload) } // 工廠實現:創建 modelAXX type AXXFactory struct{} func (af *AXXFactory) GetCreatePayload() interface{} { return modelAXX{Value: "Hello from AXX"} } // 工廠實現:創建 modelBXX type BXXFactory struct{} func (bf *BXXFactory) GetCreatePayload() interface{} { return modelBXX{Value: 123} } func main() { ia := &IAXX{} ib := &IBXX{} ia.Create(&AXXFactory{}) ib.Create(&BXXFactory{}) }
在這個例子中,AXXFactory和BXXFactory分別實現了ICreatorFactory,并返回各自的模型類型。IAXX和IBXX通過類型斷言安全地獲取參數,避免了類型不匹配的問題。 這種方法保持了代碼的靈活性和可擴展性,并且避免了使用interface{}帶來的類型安全隱患。 需要注意的是,類型斷言(.(modelAXX))的使用需要確保傳入的工廠確實返回正確的類型,否則會發生運行時panic。 更健壯的實現可能需要添加錯誤處理機制。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END