最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

wire能做什么?

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

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

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

具體代碼實(shí)現(xiàn)如下,

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

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

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

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

wire如何解放雙手?

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

  • provider:是NewShoppingCart, NewProductList這兩個(gè)函數(shù)

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

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

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

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

然后,在文件所在目錄,執(zhí)行wire。這個(gè)時(shí)候,會(huì)出現(xiàn)一個(gè)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生成的代碼,和我們自己寫的是一樣的。相比于處理復(fù)雜的對象依賴關(guān)系,寫一個(gè)injector要簡單的多。關(guān)于wire的使用,還是有一些坑的,下面我們看看如何避開這些坑。

注意事項(xiàng)

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

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

當(dāng)injector中,有多個(gè)provider生成同一個(gè)對象時(shí),會(huì)報(bào)上述錯(cuò)誤。

坑二:當(dāng)使用接口時(shí),保證上provider生成的是接口,后一個(gè)provider使用的也是接口,同時(shí)保證1對1關(guān)系;

坑三:如果一個(gè)provider生成的是接口實(shí)現(xiàn)的結(jié)構(gòu)體,另外一個(gè)是provider的入?yún)⑹墙涌?,這個(gè)時(shí)候,需要顯式的使用wire.Bind函數(shù)告訴接口的具體實(shí)現(xiàn)者。

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

坑四:提供的Provider需要?jiǎng)倓偤?,不要多,也不要少?/p>

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

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

相關(guān)文章

  • GO語言實(shí)現(xiàn)簡單TCP服務(wù)的方法

    GO語言實(shí)現(xiàn)簡單TCP服務(wù)的方法

    這篇文章主要介紹了GO語言實(shí)現(xiàn)簡單TCP服務(wù)的方法,實(shí)例分析了Go語言實(shí)現(xiàn)TCP服務(wù)的技巧,需要的朋友可以參考下
    2015-03-03
  • golang?開啟opencv圖形化編程

    golang?開啟opencv圖形化編程

    這篇文章主要為大家介紹了golang?開啟opencv圖形化編程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • golang如何使用gomobile進(jìn)行Android開發(fā)

    golang如何使用gomobile進(jìn)行Android開發(fā)

    golang可以開發(fā)android,使用golang開發(fā)android需要下載安裝gomobile,下面這篇文章主要給大家介紹了關(guān)于golang如何使用gomobile進(jìn)行Android開發(fā)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Golang實(shí)現(xiàn)自定義時(shí)間結(jié)構(gòu)體并支持Json&Gorm

    Golang實(shí)現(xiàn)自定義時(shí)間結(jié)構(gòu)體并支持Json&Gorm

    因?yàn)闀r(shí)區(qū)等問題,很多項(xiàng)目需要自定義時(shí)區(qū)和時(shí)間格式,所以這篇文章主要為大家介紹了Golang如何實(shí)現(xiàn)自定義時(shí)間結(jié)構(gòu)體并支持Json&Gorm,希望對大家有所幫助
    2024-03-03
  • golang coroutine 的等待與死鎖用法

    golang coroutine 的等待與死鎖用法

    這篇文章主要介紹了golang coroutine 的等待與死鎖用法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • golang中json的omitempty使用操作

    golang中json的omitempty使用操作

    這篇文章主要介紹了golang中json的omitempty使用操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang中生成隨機(jī)字符串并復(fù)制到粘貼板的方法

    Golang中生成隨機(jī)字符串并復(fù)制到粘貼板的方法

    這篇文章主要介紹了Golang中生成隨機(jī)字符串并復(fù)制到粘貼板的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Golang 實(shí)現(xiàn)Thrift客戶端連接池方式

    Golang 實(shí)現(xiàn)Thrift客戶端連接池方式

    這篇文章主要介紹了Golang 實(shí)現(xiàn)Thrift客戶端連接池方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go?Redis客戶端使用的兩種對比

    Go?Redis客戶端使用的兩種對比

    這篇文章主要為大家介紹了Go?Redis客戶端使用對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 一文教你學(xué)會(huì)Go中singleflight的使用

    一文教你學(xué)會(huì)Go中singleflight的使用

    緩存在項(xiàng)目中使用應(yīng)該是非常頻繁的,提到緩存只要了解過?singleflight?,基本都會(huì)用于緩存實(shí)現(xiàn)的一部分吧,下面就跟隨小編一起來學(xué)習(xí)一下singleflight的使用吧
    2024-02-02

最新評論

金昌市| 博客| 六枝特区| 应城市| 甘泉县| 崇义县| 化州市| 双峰县| 马鞍山市| 肃宁县| 永兴县| 东兴市| 应城市| 平乐县| 台北县| 河西区| 呼和浩特市| 苍山县| 普宁市| 辉南县| 东宁县| 渝中区| 读书| 福鼎市| 潍坊市| 景德镇市| 马山县| 乳山市| 双城市| 榆林市| 三门峡市| 山阴县| 达孜县| 大英县| 安丘市| 丽水市| 云南省| 蒙阴县| 芦山县| 五原县| 广水市|