欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go依賴注入管理工具wire的使用方法

 更新時間:2023年09月24日 14:39:30   作者:小范真是一把好手  
本文主要介紹了如何使用go wire管理依賴,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

wire能做什么?

wire是一個依賴注入管理的工具。主要包含兩個角色provider,injector,

  • provider: a function that can produce a value.
  • injector: a fucntion that calls providers in dependency order.

我們通過簡單電子商務網站的例子來看看wire能干什么。假設有個購物車(ShoppingCart)的對象,該對象由多個產品列表(ProductList)組成,他們的UML關系如下

具體代碼實現如下,

type ShoppingCart struct {
    // 依賴于產品列表
    ProductList *ProductList
    // 其他屬性和方法
}
// 產品列表模塊
type ProductList struct {
    // 一些產品數據和方法
}
// 創(chuàng)建購物車的函數, 這就是依賴注入
// ShoppingCart對象,需要的部分組件,來自于入參,而不是函數內部構建
func NewShoppingCart(pl *ProductList) (*ShoppingCart, error) {
    return &ShoppingCart{ProductList: pl}, nil
}
// 創(chuàng)建產品列表的函數
func NewProductList() (*ProductList, error) {
    return &ProductList{}, nil
}

在不使用wire的情況下,如果我們需要使用ShoppingCart對象,需要下面這樣一段初始化代碼:

func InitializeShoppingCart() (*ShoppingCart, error) {
	// 1. 首先構建productList
    productList, err := NewProductList()
	if err != nil {
		return nil, err
	}
    // 2. 構建ShoppingCart
	shoppingCart, err := NewShoppingCart(productList)
	if err != nil {
		return nil, err
	}
	return shoppingCart, nil
}

這個例子只涉及到兩個對象,所以這段代碼寫起來不費力氣。如果這是一個復雜的WebServer對象呢?我們初始化較多的對象,比如redisDao,MySQLDao,Kafka,Log,httpServer,grpcServer等等,這些依賴關系都需要我們自己處理,那得多麻煩啊。所以,wire就是解決這個問題的,你可以理解wire幫我們寫了類似于InitializeShoppingCart 這個函數。 下面,我們來看看如何使用wire?

wire如何解放雙手?

我們知道wire中有兩個概念,一個是provider,一個是injector,在上面例子中,

  • provider:是NewShoppingCart, NewProductList這兩個函數

他們有一個共同點是,都創(chuàng)建一個對象?,F在我們需要創(chuàng)建一個指令,告訴wire如何根據這些provider,寫出InitializaShoppingCart這個函數。我們想想,如果wire是一個人,你該如何告訴他寫這個函數呢?

  • 告訴他,這個函數,最終創(chuàng)建的對象是什么?也就是return是什么?【注,也有一些人這樣寫,傳入的是指針,函數中所有的操作,就是初始化這個指針中的內容】
  • 需要有哪些provider,能夠創(chuàng)建最終的對象?

明白這兩點,我們新建一個wire.go的文件,并在開始處寫上+build wireinjector。接著,寫上這樣一段代碼:

func InitializeShoppingCart() (*ShoppingCart, error) {
	wire.Build(
		NewShoppingCart,
		NewProductList,
	)
	return nil, nil
}

然后,在文件所在目錄,執(zhí)行wire。這個時候,會出現一個wire_gen.go的文件。

func InitializeShoppingCart() (*ShoppingCart, error) {
	productList, err := NewProductList()
	if err != nil {
		return nil, err
	}
	shoppingCart, err := NewShoppingCart(productList)
	if err != nil {
		return nil, err
	}
	return shoppingCart, nil
}

wire生成的代碼,和我們自己寫的是一樣的。相比于處理復雜的對象依賴關系,寫一個injector要簡單的多。關于wire的使用,還是有一些坑的,下面我們看看如何避開這些坑。

注意事項

坑一:創(chuàng)建同一個對象,只需要一個provider,不要創(chuàng)建多個provider。

set has multiple bindings for go-tool/basic/wire1.Fooer

當injector中,有多個provider生成同一個對象時,會報上述錯誤。

坑二:當使用接口時,保證上provider生成的是接口,后一個provider使用的也是接口,同時保證1對1關系;

坑三:如果一個provider生成的是接口實現的結構體,另外一個是provider的入參是接口,這個時候,需要顯式的使用wire.Bind函數告訴接口的具體實現者。

 var set = wire.NewSet(NewFooerImp, NewSecond, wire.Bind(new(Fooer), new(*MyFooer)))

坑四:提供的Provider需要剛剛好,不要多,也不要少;

  • inject InitializeEvent: unused provider "NewEventNumber: 有沒有使用過的provider;
  • inject InitializeEvent: no provider found for Greet: 沒有provider;

以上就是go依賴注入管理工具wire的使用方法的詳細內容,更多關于go wire管理依賴的資料請關注腳本之家其它相關文章!

相關文章

  • golang打包成帶圖標的exe可執(zhí)行文件

    golang打包成帶圖標的exe可執(zhí)行文件

    這篇文章主要給大家介紹了關于golang打包成帶圖標的exe可執(zhí)行文件的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-06-06
  • Go map排序的實現示例

    Go map排序的實現示例

    map默認是無序的,不管是按照key還是按照value默認都不排序,本文主要介紹了Go map排序的實現示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Golang HTTP 服務平滑重啟及升級的思路

    Golang HTTP 服務平滑重啟及升級的思路

    Golang HTTP服務在上線時,需要重新編譯可執(zhí)行文件,關閉正在運行的進程,然后再啟動新的運行進程。這篇文章主要介紹了Golang HTTP 服務平滑重啟及升級,需要的朋友可以參考下
    2020-04-04
  • 關于golang 字符串 int uint int64 uint64 互轉問題

    關于golang 字符串 int uint int64 uint64&

    這篇文章主要介紹了golang 字符串 int uint int64 uint64 互轉,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • 關于Go語言中特有的設計模式與實現方式講解

    關于Go語言中特有的設計模式與實現方式講解

    雖然Go語言沒有像其他語言那樣明確的設計模式,但在實踐中,開發(fā)者們仍然發(fā)現了一些在Go語言中特別適用的設計模式和實現方式,本文就來和大家一一進行講解
    2023-05-05
  • Go語言實現分布式鎖

    Go語言實現分布式鎖

    分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源時,需要通過一些互斥手段來防止彼此之間的干擾以保證一致性,在這種情況下,就需要使用分布式鎖了
    2023-01-01
  • 詳解Go語言中for range的

    詳解Go語言中for range的"坑"

    這篇文章主要介紹了詳解Go語言中for range的"坑",文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Golang字符串常用函數的使用

    Golang字符串常用函數的使用

    Golang提供了許多內置的字符串函數,這些函數可在處理字符串數據時幫助執(zhí)行一些操作,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 自己動手用Golang實現約瑟夫環(huán)算法的示例

    自己動手用Golang實現約瑟夫環(huán)算法的示例

    這篇文章主要介紹了自己動手用Golang實現約瑟夫環(huán)算法的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • 一文詳解如何在Golang中實現JWT認證與授權

    一文詳解如何在Golang中實現JWT認證與授權

    在現代Web應用中,安全性是一個非常重要的課題,JWT作為一種常用的認證與授權機制,已被廣泛應用于各種系統(tǒng)中,下面我們就來看看如何在Golang中實現JWT認證與授權吧
    2025-03-03

最新評論