golang 之 wire 庫(kù)的使用小結(jié)
1. 寫(xiě)在最前面
之前 review 其他人的代碼的時(shí)候,看到了關(guān)于 wire 庫(kù)的使用。但當(dāng)時(shí)主要是分析邏輯上的問(wèn)題,沒(méi)怎么太學(xué)習(xí) wire 庫(kù)的用法,剛好最近趁著提測(cè)的間隙,學(xué)習(xí)一下!
注:wire 庫(kù) github.com/google/wire/cmd/wire 是 Google 開(kāi)發(fā)的一個(gè)用于依賴注入的 Go 語(yǔ)言庫(kù)。Wire 采用了編譯時(shí)依賴注入的方式,旨在減少運(yùn)行時(shí)開(kāi)銷,提高應(yīng)用程序的性能和可維護(hù)性。
2. 介紹
2.1 特點(diǎn)介紹
編譯時(shí)依賴注入:Wire 在編譯時(shí)解析依賴關(guān)系,生成代碼以滿足依賴。這意味著在運(yùn)行時(shí)沒(méi)有反射或其他開(kāi)銷,從而提高了性能。
類型安全:Wire 利用 Go 的類型系統(tǒng),確保依賴關(guān)系的正確性。這可以在編譯時(shí)捕獲錯(cuò)誤,而不是在運(yùn)行時(shí)。
簡(jiǎn)單易用:Wire 的 API 設(shè)計(jì)簡(jiǎn)單,易于理解和使用。通過(guò)明確的配置,可以輕松管理復(fù)雜的依賴關(guān)系。
生成代碼:Wire 使用代碼生成的方式創(chuàng)建所需的構(gòu)造函數(shù)和初始化代碼。用戶只需定義依賴關(guān)系,Wire 會(huì)自動(dòng)生成滿足這些依賴的代碼。
2.2 使用函數(shù)解釋
wire.NewSet
允許你組合多個(gè)提供者函數(shù),組織依賴關(guān)系。wire.Build
用于定義 Injector 的構(gòu)建邏輯,自動(dòng)生成滿足依賴關(guān)系的代碼。
3. 代碼示例
存儲(chǔ)層 (store/store.go):
// 定義了一個(gè)消息存儲(chǔ)接口 type Store interface { Save(msg Message) error Get() (Message, error) } // ProvideStore 將 InMemoryStore 綁定到 Store 接口 func ProvideStore() Store { return NewInMemoryStore() } // StoreSet 是 Wire 的 provider set var StoreSet = wire.NewSet( ProvideStore, )
服務(wù)層 (service/service.go):
// MessageService 依賴于 Store 接口 type MessageService struct { store store.Store } // Wire Provider: 告訴 Wire 如何構(gòu)造 MessageService func NewMessageService(s store.Store) *MessageService
應(yīng)用層 (main.go):
// MessageApp 依賴于 MessageService type MessageApp struct { msgService *service.MessageService } // Wire Provider: 告訴 Wire 如何構(gòu)造 MessageApp func NewMessageApp(service *service.MessageService) *MessageApp
Wire 配置 (wire.go):
// 定義依賴注入的規(guī)則 func InitializeMessageApp() (*MessageApp, error) { wire.Build( store.StoreSet, // 提供 Store 接口的實(shí)現(xiàn) service.NewMessageService, // 提供 MessageService 的構(gòu)造函數(shù) NewMessageApp, // 提供 MessageApp 的構(gòu)造函數(shù) ) return &MessageApp{}, nil // 這個(gè)返回值會(huì)被 Wire 生成的代碼替換 }
依賴關(guān)系:
- MessageApp 依賴 → MessageService
- MessageService 依賴 → Store 接口
- Store 接口由 InMemoryStore 實(shí)現(xiàn)
Wire 的工作流程:
- 分析 wire.go 中的 InitializeMessageApp 函數(shù)
- 檢查所有依賴關(guān)系
- 生成 wire_gen.go 文件,包含了正確順序的依賴初始化代碼
- 運(yùn)行時(shí),自動(dòng)按正確順序創(chuàng)建和注入所有依賴
// Code generated by Wire. DO NOT EDIT. //go:generate go run -mod=mod github.com/google/wire/cmd/wire //go:build !wireinject // +build !wireinject package main import ( "example/wire/service" "example/wire/store" ) // Injectors from wire.go: // InitializeMessageApp 使用 Wire 來(lái)注入依賴并初始化應(yīng)用 func InitializeMessageApp() (*MessageApp, error) { storeStore := store.ProvideStore() messageService := service.NewMessageService(storeStore) messageApp := NewMessageApp(messageService) return messageApp, nil }
這種依賴注入方式的優(yōu)點(diǎn):
- 解耦:各組件之間通過(guò)接口交互,不直接依賴具體實(shí)現(xiàn)
- 可測(cè)試:易于替換模擬實(shí)現(xiàn)進(jìn)行測(cè)試
- 維護(hù)性:依賴關(guān)系清晰,容易管理
- 編譯時(shí)檢查:在編譯時(shí)就能發(fā)現(xiàn)依賴配置問(wèn)題
4. 碎碎念
之前一陣子焦慮 AI 是不是會(huì)替代自己,但是換個(gè)角度想,如果能更充分的利用 AI,是不是之前消耗的很多時(shí)間都可以節(jié)省掉,這樣就可以做很多有意義的事情啦:
- 她那個(gè)時(shí)候還太年輕,不知道所有命運(yùn)饋贈(zèng)的禮物,都早已在背后標(biāo)好了價(jià)格。
- 不要責(zé)怪以前的自己, 她那時(shí)一個(gè)人站在霧里也很迷茫。
- 紐約的時(shí)間比加州時(shí)間早3個(gè)小時(shí),但加州并沒(méi)變慢,奧巴馬55歲就退休了,但川普70歲才當(dāng)上總統(tǒng),世界上每個(gè)人本來(lái)都有自己的時(shí)區(qū),有些人看似走在你前面,有些人看似走在你后面,但其實(shí)每個(gè)人都有自己的時(shí)區(qū)和步程,不用嫉妒和嘲笑他們,每個(gè)人都在自己的時(shí)區(qū)里,你也是 。
5. 參考資料
到此這篇關(guān)于golang 之 wire 庫(kù)的使用總結(jié)的文章就介紹到這了,更多相關(guān)golang wire 庫(kù)使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Go語(yǔ)言如何判斷兩個(gè)對(duì)象是否相等
在編程中,判斷兩個(gè)對(duì)象是否相等是一項(xiàng)常見(jiàn)的任務(wù),同時(shí)判斷對(duì)象是否相等在很多情況下都非常重要,所以在接下來(lái)的內(nèi)容中,我們將詳細(xì)介紹在?Go?語(yǔ)言中如何判斷對(duì)象是否相等的方法和技巧,需要的可以參考一下2023-06-06Go基礎(chǔ)教程系列之?dāng)?shù)據(jù)類型詳細(xì)說(shuō)明
這篇文章主要介紹了Go基礎(chǔ)教程系列之?dāng)?shù)據(jù)類型詳細(xì)說(shuō)明,需要的朋友可以參考下2022-04-04Golang使用gob實(shí)現(xiàn)結(jié)構(gòu)體的序列化過(guò)程詳解
Golang struct類型數(shù)據(jù)序列化用于網(wǎng)絡(luò)傳輸數(shù)據(jù)或在磁盤(pán)上寫(xiě)入數(shù)據(jù)。在分布式系統(tǒng)中,一端生成數(shù)據(jù)、然后序列化、壓縮和發(fā)送;在另一端,接收數(shù)據(jù)、然后解壓縮、反序列化和處理數(shù)據(jù),整個(gè)過(guò)程必須快速有效2023-03-03Go語(yǔ)言自定義包構(gòu)建自己的編程工具庫(kù)
Go 語(yǔ)言的強(qiáng)大不僅體現(xiàn)在其內(nèi)置功能上,還在于其支持自定義包,這為開(kāi)發(fā)者提供了極大的靈活性和可擴(kuò)展性,本文將深入介紹如何創(chuàng)建、使用和管理自定義包,探索 Go 語(yǔ)言包的奧秘,打造屬于你的編程工具庫(kù)2023-11-11