




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第讀取Go項(xiàng)目中的配置文件的方法目錄來(lái)看看gonfig是怎么解決這個(gè)問(wèn)題的約定根據(jù)項(xiàng)目定制化配置文件原理篇Go語(yǔ)言提供了很簡(jiǎn)便的讀取json和yaml文件的api,我們可以很輕松將一個(gè)json或者yaml文件轉(zhuǎn)換成Go的結(jié)構(gòu)體,但是如果直接在項(xiàng)目中讀取配置文件,這種方式并不夠好。缺點(diǎn)如下:
實(shí)際開(kāi)發(fā)中配置項(xiàng)在不同環(huán)境下,配置的值是不同的
上面的問(wèn)題可以通過(guò)不同的配置文件去決定在那個(gè)環(huán)境讀取那個(gè)配置文件,但是還有一個(gè)問(wèn)題就是實(shí)際開(kāi)發(fā)中,配置項(xiàng)有些是相同的,有些是不同的,如果配置文件有一個(gè)主配置文件,里面存放的是不同環(huán)境相同的配置項(xiàng),還有一個(gè)跟隨環(huán)境的配置文件,里面存放的是不同環(huán)境的配置項(xiàng),然后讀取兩個(gè)配置文件后,做一個(gè)merge,這樣得到的結(jié)果就是總共的配置項(xiàng)信息。
有些配置項(xiàng)是必填的,有些配置項(xiàng)的值是一些特殊的值,比如,郵箱,手機(jī)號(hào),IP信息等
來(lái)看看gonfig是怎么解決這個(gè)問(wèn)題的
安裝gonfig
goget/xiao-ren-wu/gonfig
項(xiàng)目中新建配置目錄,并編寫對(duì)應(yīng)配置文件,在配置目錄同級(jí)目錄添加讀取配置文件的go文件
conf.yaml文件中存放的是通用的配置,conf-{{active}}.yaml中存放不同環(huán)境不同的配置信息。
conf
|-conf.yaml
|-conf-dev.yaml
|-conf-prod.yaml
|config.go
利用go:embed將配置文件載入到內(nèi)存,調(diào)用gonfig.Unmarshal讀取配置文件
packageconfig
import(
"model"
"/xiao-ren-wu/gonfig"
"embed"
//go:embed*.yaml
varconfDirembed.FS
//我們配置文件的配置struct
typeAppConfstruct{
AppNamestring`yaml:"app-name"json:"app-name"`
DBDBConf`yaml:"db"json:"db"`
typeDBConfstruct{
Usernamestring`yaml:"username"json:"username"`
Passwordstring`yaml:"password"json:"password"`
varconfConf
funcInit(){
iferr:=gonfig.Unmarshal(confDir,conf);err!=nil{
panic(err)
funcGetConf()*Conf{
returnconf
}
這樣就完成了項(xiàng)目中配置文件的讀取,是不是很簡(jiǎn)單?此時(shí)讀到的配置形式是conf-{{profile}}.yaml和conf.yaml的總和,如果conf-{{profile}}.yaml中定義的屬性和conf.yaml相同,那么會(huì)以conf-{{profile}}.yaml為準(zhǔn)
約定
gonfigAPI的簡(jiǎn)潔性的原因是因?yàn)楸澈笞隽撕芏嗉s束,只有符合約束的配置才能被成功讀取,具體的約束條件如下:
gonfig.Unmarshal會(huì)默認(rèn)讀取文件名稱有前綴conf的文件
通過(guò)環(huán)境變量profile作為環(huán)境名稱,如果沒(méi)有配置,默認(rèn)dev。
程序會(huì)尋找conf.yaml作為主配置文件,conf-{{profile}}.yaml作為環(huán)境特有配置文件,然后對(duì)文件內(nèi)容進(jìn)行合并
如果conf-{{profile}}.yaml中的屬性和conf.yaml中屬性都有定義,那么會(huì)以conf-{{profile}}.yaml為準(zhǔn)。
根據(jù)項(xiàng)目定制化配置文件
gonfig.Unmarshal的函數(shù)簽名funcUnmarshal(confDirReadFileDir,vinterface{},ops...Option)error提供很多配置項(xiàng),供用戶定制化需求,具體的配置信息如下:
更改配置文件名稱前綴FilePrefix(prefixstring)
更改讀取配置文件類型UnmarshalWith(uTypeUnmarshalType)
更改讀取的環(huán)境變量名稱ProfileUseEnv(envName,defaultProfilestring)
自定義設(shè)置profileProfileFunc(ffunc()string)
原理篇
gonfig的實(shí)現(xiàn)也很簡(jiǎn)單,核心的源碼如下:
funcUnmarshal(confDirReadFileDir,vinterface{},ops...Option)error{
ifv!=nilreflect.ValueOf(v).Kind()!=reflect.Ptr{
returngonfig_error.ErrNonPointerArgument
varcs=confStruct{
confPrefix:"conf",
envName:"profile",
defaultEnvValue:"dev",
unmarshalType:Yaml,
cs.activeProfileFunc=func()string{
returngetActiveProfile(cs.envName,cs.defaultEnvValue)
for_,op:=rangeops{
op(cs)
fileActive=cs.activeProfileFunc()
iferr:=loadConf(confDir,cs);err!=nil{
returnerr
//copyval
v1:=reflect.New(reflect.TypeOf(v).Elem()).Interface()
iferr:=fileUnmarshal(cs.activeConfRaw,v1,cs.unmarshalType);err!=nil{
returnerr
iflen(cs.masterConfRaw)==0{
returngonfig_error.MasterProfileConfNotSetError
iferr:=fileUnmarshal(cs.masterConfRaw,v,cs.unmarshalType);err!=nil{
returnerr
returnmergo.Merge(v,v1,mergo.WithOverride)
}
大概的原理就是復(fù)制了一份用戶傳給函
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度網(wǎng)絡(luò)安全風(fēng)險(xiǎn)評(píng)估與咨詢合同范本
- 2025年度綜合安防系統(tǒng)設(shè)備全壽命周期維保服務(wù)合同
- 二零二五年度SaaS合同范本:二零二五年度SaaS平臺(tái)在線教育平臺(tái)合作協(xié)議
- 二零二五年度CRM系統(tǒng):銷售合同管理云服務(wù)合同
- 二零二五年度班組勞務(wù)承包與企業(yè)文化認(rèn)同合同
- 公司漂流活動(dòng)方案
- 中考前的班會(huì)課課件
- 中考作文備考說(shuō)課課件
- 臨床補(bǔ)液的原則試題2025新版
- 離退休職工迎新春座談會(huì)活動(dòng)方案
- GB/T 10045-2018非合金鋼及細(xì)晶粒鋼藥芯焊絲
- GB 7099-2015食品安全國(guó)家標(biāo)準(zhǔn)糕點(diǎn)、面包
- 2023年納雍縣財(cái)政局系統(tǒng)事業(yè)單位招聘筆試題庫(kù)及答案解析
- 2023年廣東省普通高中學(xué)業(yè)水平考試及參考答案
- 建筑工程模板施工工藝技術(shù)要點(diǎn)講義豐富課件
- 永能選煤廠生產(chǎn)安全事故應(yīng)急救援預(yù)案
- 浙江省建設(shè)領(lǐng)域簡(jiǎn)易勞動(dòng)合同(A4版本)
- 位置度公差以及其計(jì)算
- 氯化銨危險(xiǎn)化學(xué)品安全周知卡
- 浙江省本級(jí)公務(wù)車輛租賃服務(wù)驗(yàn)收單(格式)
- 糖代謝紊亂的實(shí)驗(yàn)診斷
評(píng)論
0/150
提交評(píng)論