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

Go依賴注入工具wire的具體使用

 更新時間:2023年05月22日 11:12:28   作者:夢想畫家  
本文主要介紹了Go依賴注入工具wire的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Go相對java和C++是較新的語言,但也有諸多優(yōu)秀特性及生態(tài)庫。本文介紹大多數(shù)軟件工程中常用的功能:依賴注入。首先介紹什么是依賴注入,go實現(xiàn)庫wire與其他語言的差異。然后通過簡單示例實現(xiàn)依賴注入,簡化代碼、提升可讀性。

依賴注入

依賴注入是一種對象接收它所依賴的其他對象(稱為依賴項)的技術(shù)。通常,接收對象稱為客戶端,傳入(“注入”)對象稱為服務(wù)。

為了更好理解,下面通過一個簡單示例進(jìn)行說明:

package main
import (
? ?"fmt"
)
type Message string
type Greeter struct {
? ?Message Message
}
type Event struct {
? ?Greeter Greeter
}
func GetMessage() Message {
? ?return Message("Hello world!")
}
func GetGreeter(m Message) Greeter {
? ?return Greeter{Message: m}
}
func (g Greeter) Greet() Message {
? ?return g.Message
}
func GetEvent(g Greeter) Event {
? ?return Event{Greeter: g}
}
func (e Event) Start() {
? ?msg := e.Greeter.Greet()
? ?fmt.Println(msg)
}
func main() {
? ?message := GetMessage()
? ?greeter := GetGreeter(message)
? ?event := GetEvent(greeter)
? ?event.Start()
}

上面代碼有message, greeter, event;GetMessage函數(shù)返回消息,GetGreeter函數(shù)接受消息返回greeter,getEvent函數(shù)接受返回greeter返回事件。事件還有一個方法start輸出消息。

在main函數(shù)中,首先創(chuàng)建消息,然后作為依賴傳入greeter,最后傳給事件。運行程序可以看到輸出“Hello world!",這是相對較淺的依賴圖,但也能看到其復(fù)雜性,這也是依賴注入庫wire的價值體現(xiàn)。

Wire簡介

Wire是代碼依賴工具,它沒有采用反射機(jī)制或運行時狀態(tài),使用Wire可以有效避免手動編寫硬代碼依賴。Wire在編譯時生成源碼,官方文檔描述: “In Wire, dependencies between components are represented as function parameters, encouraging explicit initialization instead of global variables.” (在Wire中組件之間的依賴關(guān)系表示為函數(shù)參數(shù),優(yōu)先采用顯式初始化而不是全局變量。)

通過下面命令安裝wire:go get github.com/google/wire/cmd/wire;全局安裝wire,為后續(xù)使用wire命令生成代碼:go install github.com/google/wire/cmd/wire

下面我們使用Wire作為依賴注入工具重構(gòu)上面代碼,新增wire.go文件,增加下面代碼:

//go:build wireinject
// +build wireinject
package main
import "github.com/google/wire"
func InitializeEvent() Event {
? ?wire.Build(GetMessage, GetGreeter, GetEvent)
? ?return Event{}
}

首先導(dǎo)入wire,然后創(chuàng)建InitializeEvent函數(shù),該返回在main函數(shù)中調(diào)用的事件。函數(shù)體內(nèi)調(diào)用wire,在構(gòu)建器方法內(nèi)傳入所有依賴,注意,傳入依賴與順序無關(guān)。然后返回空事件,無需擔(dān)心,所有交給Wire。

注意,文件上面的注釋告訴Go在編譯時忽略該文件,要確保該注釋行后面增加一行空行。

下面是main函數(shù)代碼:

func main() {
   event := InitializeEvent()
   event.Start()
}

現(xiàn)在成功地把main函數(shù)代碼降為兩行。在wire.go代碼目錄下,執(zhí)行wire命令,wire會生成wire_gen.go文件:

// Code generated by Wire. DO NOT EDIT.
//go:generate go run github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
package main
// Injectors from wire.go:
func InitializeEvent() Event {
?? ?message := GetMessage()
?? ?greeter := GetGreeter(message)
?? ?event := GetEvent(greeter)
?? ?return event
}

同樣生成的文件上面注釋與wire.go文件相比多了!,表示wire在編譯時忽略,go編譯時啟動。這是運行main函數(shù)正確輸出結(jié)果。

帶參數(shù)依賴

如果需要動態(tài)傳入消息作為參數(shù)呢?下面我們修改GetMessage函數(shù):

func GetMessage(text string) Message {
   return Message(text)
}

再次運行wire命令,可以看到wire_gen.go 代碼也有相應(yīng)修改:

// Code generated by Wire. DO NOT EDIT.
//go:generate go run github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
package main
// Injectors from wire.go:
func InitializeEvent(text string) Event {
?? ?message := GetMessage(text)
?? ?greeter := GetGreeter(message)
?? ?event := GetEvent(greeter)
?? ?return event
}

現(xiàn)在修改main.go代碼:

func main() {
    event := InitializeEvent("Hello Golang")
    event.Start()
}

運行結(jié)果與期望一致。

如果修改wire.go代碼, 模擬缺少部分依賴:

func InitializeEvent(text string) Event {
    wire.Build(GetMessage, GetEvent)
    return Event{}
}

執(zhí)行wire命令,會正確提示少了相應(yīng)的依賴:

inject InitializeEvent: no provider found for demo01.Greeter needed by demo01.Event in provider "GetEvent" 

總結(jié)

本文介紹了基本wire概念,并通過簡單示例介紹動態(tài)實現(xiàn)依賴注入。但一般wire會在較大項目使用,更多高級功能參考官方文檔:https://github.com/google/wire/blob/main/docs/guide.md#advanced-features 。

到此這篇關(guān)于Go依賴注入工具wire的文章就介紹到這了,更多相關(guān)Go依賴注入工具wire內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Go初始化Struct的方法詳解

    使用Go初始化Struct的方法詳解

    面向?qū)ο缶幊陶Z言最基礎(chǔ)的概念就是類(class),不過Go語言并沒有類的概念,所以使用Go語言開發(fā)時,我們一般會用struct(結(jié)構(gòu)體)來模擬面向?qū)ο笾械念?下面我們來介紹幾種創(chuàng)建struct類型變量的方法,需要的朋友可以參考下
    2024-01-01
  • gin自定義中間件解決requestBody不可重復(fù)讀問題(最新推薦)

    gin自定義中間件解決requestBody不可重復(fù)讀問題(最新推薦)

    這篇文章主要介紹了gin自定義中間件解決requestBody不可重復(fù)讀問題,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • golang?鏈路追蹤的實現(xiàn)示例

    golang?鏈路追蹤的實現(xiàn)示例

    本文主要介紹了golang?鏈路追蹤的實現(xiàn)示例,包括調(diào)用鏈過長和接口響應(yīng)慢的問題,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • 詳解Golang?ProtoBuf的基本語法總結(jié)

    詳解Golang?ProtoBuf的基本語法總結(jié)

    最近項目是采用微服務(wù)架構(gòu)開發(fā)的,各服務(wù)之間通過gPRC調(diào)用,基于ProtoBuf序列化協(xié)議進(jìn)行數(shù)據(jù)通信,因此接觸學(xué)習(xí)了Protobuf,本文會對Protobuf的語法做下總結(jié),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-10-10
  • Golang中HTTP路由設(shè)計的使用與實現(xiàn)

    Golang中HTTP路由設(shè)計的使用與實現(xiàn)

    這篇文章主要介紹了Golang中HTTP路由設(shè)計的使用與實現(xiàn),為什么要設(shè)計路由規(guī)則,因為路由規(guī)則是HTTP的請求按照一定的規(guī)則 ,匹配查找到對應(yīng)的控制器并傳遞執(zhí)行的邏輯,需要的朋友可以參考下
    2023-05-05
  • GO語言數(shù)組和切片實例詳解

    GO語言數(shù)組和切片實例詳解

    這篇文章主要介紹了GO語言數(shù)組和切片的用法,以實例形式較為詳細(xì)的分析了GO語言中數(shù)組與切片的創(chuàng)建及使用技巧,是深入學(xué)習(xí)GO語言的基礎(chǔ),需要的朋友可以參考下
    2014-12-12
  • Golang logrus 日志包及日志切割的實現(xiàn)

    Golang logrus 日志包及日志切割的實現(xiàn)

    這篇文章主要介紹了Golang logrus 日志包及日志切割的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 詳解Go語言中for range的

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

    這篇文章主要介紹了詳解Go語言中for range的"坑",文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Go正則表達(dá)式匹配字符串,替換字符串方式

    Go正則表達(dá)式匹配字符串,替換字符串方式

    介紹了Go語言中使用正則表達(dá)式進(jìn)行字符串匹配和替換的方法,包括匹配單個子字符串和所有子字符串,個人經(jīng)驗分享,旨在為讀者提供實用的編程技巧,并鼓勵大家支持腳本之家
    2025-02-02
  • 簡單聊聊Go語言里面的閉包

    簡單聊聊Go語言里面的閉包

    這篇文章主要為大家詳細(xì)介紹了Go語言中閉包的原理與實現(xiàn)的相關(guān)資料,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-11-11

最新評論

丰县| 凤冈县| 巧家县| 博爱县| 新蔡县| 天津市| 漳浦县| 铜鼓县| 江安县| 偃师市| 莲花县| 宁乡县| 东阿县| 昔阳县| 高唐县| 绥棱县| 聂拉木县| 三都| 城口县| 桂阳县| 江都市| 康定县| 兴国县| 韩城市| 酒泉市| 定陶县| 天气| 乌拉特后旗| 吐鲁番市| 彭州市| 泰安市| 改则县| 宜春市| 凤城市| 瑞金市| 雷山县| 甘泉县| 山西省| 鄂温| 台州市| 巴彦县|