首頁 > 後端開發 > Golang > 如何在不創建循環依賴的情況下註冊Go包實現?

如何在不創建循環依賴的情況下註冊Go包實現?

Barbara Streisand
發布: 2024-12-29 14:01:10
原創
185 人瀏覽過

How to Register Go Package Implementations Without Creating Cyclic Dependencies?

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板