亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
什麼是依賴(lài)注入(為什麼要打擾)?
實(shí)用方法:?jiǎn)?dòng)手冊(cè)DI
這種方法的好處
什麼時(shí)候使用DI框架?
GO中清潔DI的提示
最後的想法
首頁(yè) 後端開(kāi)發(fā) Golang GO中的依賴(lài)注入:一種實(shí)用的方法

GO中的依賴(lài)注入:一種實(shí)用的方法

Jul 25, 2025 am 02:23 AM
go 依賴(lài)注入

GO中的依賴(lài)注入最好通過(guò)Main.Go中的顯式構(gòu)造函數(shù)注入手動(dòng)實(shí)施。確保清潔,可測(cè)試和可維護(hù)的代碼。 1。初始化啟動(dòng)時(shí)核心依賴(lài)關(guān)係,例如數(shù)據(jù)庫(kù),緩存和記錄器。 2。通過(guò)通過(guò)構(gòu)造函數(shù)(例如NewuserService(DB,Logger))傳遞依賴(lài)性來(lái)進(jìn)行高層服務(wù)。 3。使用接口啟用模擬和實(shí)現(xiàn)交換。 4.保持Main。 5。僅考慮用於手動(dòng)接線變得繁瑣的大規(guī)模應(yīng)用,例如電線或挖掘諸如電線或挖掘。這種方法可確保完全控制,沒(méi)有運(yùn)行時(shí)的開(kāi)銷(xiāo)以及明確的可辯論代碼,從而使其成為處理GO中依賴(lài)關(guān)係的慣用方法。

GO中的依賴(lài)注入:一種實(shí)用的方法

依賴(lài)注入(DI)不必復(fù)雜。與具有重型框架的語(yǔ)言(例如Java中的春季)不同,請(qǐng)擁抱簡(jiǎn)單性和明確性。但是,隨著應(yīng)用程序的增長(zhǎng),手動(dòng)管理依賴(lài)關(guān)係變得凌亂。那是依賴(lài)注射(尤其是手動(dòng)di)的位置:它可以使您的代碼保持清潔,可測(cè)試和鬆散耦合。

GO中的依賴(lài)注入:一種實(shí)用的方法

讓我們走過(guò)實(shí)用的現(xiàn)實(shí)世界中的di,而無(wú)需伸手去拿諸如電線或挖掘之類(lèi)的框架,除非有必要。


什麼是依賴(lài)注入(為什麼要打擾)?

依賴(lài)注入是一種技術(shù)(或功能)從外部接收其依賴(lài)性,而不是內(nèi)部創(chuàng)建它們的技術(shù)。

GO中的依賴(lài)注入:一種實(shí)用的方法

例如,而不是這樣:

鍵入uservice struct {}

func(s *uservice)getuser(id int)( *用戶(hù),錯(cuò)誤){
    db:= newdatabase()//硬編碼依賴(lài)關(guān)係
    返回DB.FINDUSER(ID)
}

您這樣做:

GO中的依賴(lài)注入:一種實(shí)用的方法
鍵入userService struct {
    DB *數(shù)據(jù)庫(kù)
}

FUNC NEWUSERSERVICE(DB *數(shù)據(jù)庫(kù)) *userVice {
    返回和用戶(hù)服務(wù){(diào)db:db}
}

func(s *uservice)getuser(id int)( *用戶(hù),錯(cuò)誤){
    返回S.DB.FINDUSER(ID)
}

現(xiàn)在, UserService不在乎如何創(chuàng)建Database ,而只是使用它。這使得測(cè)試變得容易(您可以通過(guò)模擬),並且簡(jiǎn)單地交換實(shí)現(xiàn)。


實(shí)用方法:?jiǎn)?dòng)手冊(cè)DI

在GO中,最可維護(hù)的DI方法是在入口點(diǎn)(通常是main.go )手動(dòng)導(dǎo)線依賴(lài)性。這很明顯,可辯論和快速。

以下是:

 func main(){
    // 1。初始化低級(jí)依賴(lài)關(guān)係
    db,err:= sql.open(“ postgres”,“ ...”)
    如果err! = nil {
        log.fatal(err)
    }

    緩存:= newrediscache(“ localhost:6379”)
    logger:= log.new(os.stdout,“ app:”,log.lstdflags)

    // 2。電線高級(jí)服務(wù)
    USERREPO:= NEWUSERREPOSITOR(DB,CACH)
    UserService:= NewuserService(UserRepo,Logger)
    UserHandler:= NewuserHandler(UserService)

    // 3。設(shè)置HTTP路由
    mux:= http.newservemux()
    mux.handlefunc(“/users/”,userhandler.getuser)

    // 4。啟動(dòng)服務(wù)器
    http.listenandserve(“:8080”,Mux)
}

這是構(gòu)造函數(shù)注入- 每個(gè)組件通過(guò)其構(gòu)造函數(shù)( NewX函數(shù))接收其依賴(lài)項(xiàng)。整個(gè)依賴(lài)圖是main的,可以輕鬆查看事物如何連接。


這種方法的好處

  • ?可測(cè)試:您可以在測(cè)試中註入模擬。
  • ?明確:沒(méi)有魔術(shù)。您可以準(zhǔn)確地看到每個(gè)組件所需的內(nèi)容。
  • ?沒(méi)有運(yùn)行時(shí)開(kāi)銷(xiāo):與基於反射的DI容器不同,這只是GO代碼。
  • ?易於調(diào)試:堆棧痕跡很乾淨(jìng);沒(méi)有生成的注射代碼。

例如,在測(cè)試中:

 func tastuservice_getuser(t *testing.t){
    mockrepo:=&MockuserRepository {}
    mockrepo.on(“ finduser”,1)。返回(&user {name:“ alice”},nil)

    服務(wù):= NewuserService(Mockrepo,log.new(io.discard,“”,0))

    用戶(hù),err:= service.getuser(1)
    //斷言結(jié)果...
}

您可以完全控制。


什麼時(shí)候使用DI框架?

可以將手動(dòng)DI縮放到大型應(yīng)用程序。但是,如果您正在用數(shù)十個(gè)組件建立非常龐大的服務(wù),則可以考慮以下工具:

  • Google電線:在編譯時(shí)生成DI代碼。沒(méi)有反射,只是生成的。
  • Facebook的DIG :使用反射的運(yùn)行時(shí)DI。更多的魔術(shù),更靈活。

但是沒(méi)有它們。手動(dòng)di通常足夠 - 而且更簡(jiǎn)單。

例如,使用電線,您可以定義一個(gè)“提供商集”,並讓其生成構(gòu)建圖形的wire.go 。它在monorepos或複雜的微服務(wù)中很有用,但是對(duì)於大多數(shù)應(yīng)用程序來(lái)說(shuō),它都過(guò)高。


GO中清潔DI的提示

  • 當(dāng)您要交換實(shí)現(xiàn)時(shí),請(qǐng)使用依賴(lài)項(xiàng)(例如,用UserRepository接口與PostgresUserRepositoryMockUserRepository )。

    鍵入U(xiǎn)serRepository接口{
        Finduser(ID int)(*用戶(hù),錯(cuò)誤)
    }
  • 保持main.go:如果接線變長(zhǎng),請(qǐng)?zhí)崛〉?code>cmd/或internal/app軟件包,但要明確保持接線。

  • 避免全局狀態(tài):不要回到init()或軟件包級(jí)變量。那擊敗了di。

  • 名稱(chēng)構(gòu)造函數(shù)清楚:使用NewService(...)並使依賴(lài)關(guān)係變得明顯。

  • 相關(guān)依賴(lài)關(guān)係:例如, Config結(jié)構(gòu)可以保存數(shù)據(jù)庫(kù)設(shè)置,超時(shí)等,並在需要的地方通過(guò)。


  • 最後的想法

    當(dāng)GO中的依賴(lài)注入保持簡(jiǎn)單時(shí),它最有效。帶有明確構(gòu)造函數(shù)的手動(dòng)DI不僅是實(shí)用的,而且是慣用的。您可以在不增加複雜性的情況下獲得可測(cè)試性,靈活性和清晰度。

    像電線這樣的框架在大規(guī)模上很有幫助,但它們不能代替理解基本面。

    因此:從main開(kāi)始,從頭開(kāi)始建立您的依賴(lài)項(xiàng),將其註入您的服務(wù),並享受編寫(xiě)可測(cè)試,可維護(hù)的GO。

    基本上,這就是全部。

    以上是GO中的依賴(lài)注入:一種實(shí)用的方法的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

Laravel 教程
1597
29
PHP教程
1488
72
Switch語(yǔ)句如何運(yùn)行? Switch語(yǔ)句如何運(yùn)行? Jul 30, 2025 am 05:11 AM

Go的switch語(yǔ)句默認(rèn)不會(huì)貫穿執(zhí)行,匹配到第一個(gè)條件後自動(dòng)退出。 1.switch以關(guān)鍵字開(kāi)始並可帶一個(gè)值或不帶值;2.case按順序從上到下匹配,僅運(yùn)行第一個(gè)匹配項(xiàng);3.可通過(guò)逗號(hào)列出多個(gè)條件來(lái)匹配同一case;4.不需要手動(dòng)添加break,但可用fallthrough強(qiáng)制貫穿;5.default用於未匹配到的情況,通常放最後。

在Java的掌握依賴(lài)注入春季和Guice 在Java的掌握依賴(lài)注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴(lài)性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

使用上下文軟件包進(jìn)行取消和超時(shí) 使用上下文軟件包進(jìn)行取消和超時(shí) Jul 29, 2025 am 04:08 AM

USECONTEXTTOPROPAGATECELLATION ANDDEADEADLINESACROSSGOROUTINES,ENABLINGCOOPERATIVECELLATIONININHTTPSERVERS,背景任務(wù),andChainedCalls.2.withContext.withContext.withCancel(),CreatseAcancellableBableBablebableBableBableBablebableContExtandAndCandExtandCallCallCancelLcancel()

建立表演者為第三方API的客戶(hù) 建立表演者為第三方API的客戶(hù) Jul 30, 2025 am 01:09 AM

使用專(zhuān)用且配置合理的HTTP客戶(hù)端,設(shè)置超時(shí)和連接池以提升性能和資源利用率;2.實(shí)現(xiàn)帶指數(shù)退避和抖動(dòng)的重試機(jī)制,僅對(duì)5xx、網(wǎng)絡(luò)錯(cuò)誤和429狀態(tài)碼重試,並遵守Retry-After頭;3.對(duì)靜態(tài)數(shù)據(jù)如用戶(hù)信息使用緩存(如sync.Map或Redis),設(shè)置合理TTL,避免重複請(qǐng)求;4.使用信號(hào)量或rate.Limiter限制並發(fā)和請(qǐng)求速率,防止被限流或封禁;5.將API封裝為接口,便於測(cè)試、mock和添加日誌、追蹤等中間件;6.通過(guò)結(jié)構(gòu)化日誌和指標(biāo)監(jiān)控請(qǐng)求時(shí)長(zhǎng)、錯(cuò)誤率、狀態(tài)碼和重試次數(shù),結(jié)合Op

如何在Go中正確複製切片 如何在Go中正確複製切片 Jul 30, 2025 am 01:28 AM

要正確複製Go中的切片,必須創(chuàng)建新的底層數(shù)組,而不是直接賦值;1.使用make和copy函數(shù):dst:=make([]T,len(src));copy(dst,src);2.使用append與nil切片:dst:=append([]T(nil),src...);這兩種方法都能實(shí)現(xiàn)元素級(jí)別的複制,避免共享底層數(shù)組,確保修改互不影響,而直接賦值dst=src會(huì)導(dǎo)致兩者引用同一數(shù)組,不屬於真正複製。

如何將template.parsefs與GO嵌入? 如何將template.parsefs與GO嵌入? Jul 30, 2025 am 12:35 AM

使用template.ParseFS與embed包可將HTML模板編譯進(jìn)二進(jìn)製文件。 1.導(dǎo)入embed包並用//go:embedtemplates/.html將模板文件嵌入embed.FS變量;2.調(diào)用template.Must(template.ParseFS(templateFS,"templates/.html"))解析所有匹配的模板文件;3.在HTTP處理器中通過(guò)tmpl.ExecuteTemplate(w,"home.html",nil)渲染指定

與時(shí)間和日期一起工作 與時(shí)間和日期一起工作 Jul 30, 2025 am 02:51 AM

Go使用time.Time結(jié)構(gòu)體處理日期和時(shí)間,1.格式化和解析使用參考時(shí)間“2006-01-0215:04:05”對(duì)應(yīng)“MonJan215:04:05MST2006”,2.創(chuàng)建日期使用time.Date(year,month,day,hour,min,sec,nsec,loc)並指定時(shí)區(qū)如time.UTC,3.時(shí)區(qū)處理通過(guò)time.LoadLocation加載位置並用time.ParseInLocation解析帶時(shí)區(qū)的時(shí)間,4.時(shí)間運(yùn)算使用Add、AddDate和Sub方法進(jìn)行加減和計(jì)算間隔,

符文是什麼? 符文是什麼? Jul 31, 2025 am 02:15 AM

Aruneingoisaunicodecodepointrepointreporentedasanint32,使用了tocortloctlyhandhandlenternationCharacters; 1. userunesInesinSteadofbyTestoavoidSplittingMulti-bydeunicodecharacters; 2. 2. loopoverstringswithrangetogetrogetogetogetrogeTringsWithRangetogetrounes,notbyters; 3.converteranemantermaneflymantofelymanteranemantermanterantoflyman [] []

See all articles