在Go 中註冊沒有循環依賴的套件
設計Go 應用程式時,避免套件之間的循環依賴至關重要,因為一個包依賴一個包另一個又取決於第一個。在跨多個套件定義介面及其實作時,可能會出現這種情況。
問題:
我們如何註冊客戶端實作而不在我們的中央包之間創建循環依賴關係(與客戶端接口)和包含實現的包(例如,UDPClient, TCPClient)?
答案:
標準庫提供了兩種主要方法來解決這個問題:
1.沒有中央登錄
在中央包中定義客戶端介面。對於實現,在實例化客戶端時明確指定所需的實作。例如:
import ( "hash/md5" "hash/sha256" ) func main() { h1 := md5.New() h2 := sha256.New() }
2。使用中央登錄
建立一個登錄機制,實作可以自行註冊。這種方法類似於問題中討論的自發性註冊。它用在圖像包中,其中各種圖像格式解碼器(例如 GIF、JPEG、PNG)自行註冊。
3.建議的自訂註冊表
引入一個單獨的工廠包,提供用於建立客戶端的 NewClient() 方法。這個包可以引用介麵包和實作包,而不會造成循環依賴。例如:
package pi // Client represents the client interface. type Client interface { ... }
package pa // UDPClient implements the Client interface. type UDPClient struct { ... }
package pb // TCPClient implements the Client interface. type TCPClient struct { ... }
package pf import ( "pi" "pa" "pb" ) // NewClient creates a client based on the implementation. func NewClient(impl string) pi.Client { switch impl { case "udp": return &pa.UDPClient{} case "tcp": return &pb.TCPClient{} default: panic("Unsupported implementation") } }
以上是如何在不創建循環依賴的情況下註冊Go包實現?的詳細內容。更多資訊請關注PHP中文網其他相關文章!