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