讀取Go項目中的配置文件的方法_第1頁
讀取Go項目中的配置文件的方法_第2頁
讀取Go項目中的配置文件的方法_第3頁
讀取Go項目中的配置文件的方法_第4頁
讀取Go項目中的配置文件的方法_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第讀取Go項目中的配置文件的方法目錄來看看gonfig是怎么解決這個問題的約定根據(jù)項目定制化配置文件原理篇Go語言提供了很簡便的讀取json和yaml文件的api,我們可以很輕松將一個json或者yaml文件轉換成Go的結構體,但是如果直接在項目中讀取配置文件,這種方式并不夠好。缺點如下:

實際開發(fā)中配置項在不同環(huán)境下,配置的值是不同的

上面的問題可以通過不同的配置文件去決定在那個環(huán)境讀取那個配置文件,但是還有一個問題就是實際開發(fā)中,配置項有些是相同的,有些是不同的,如果配置文件有一個主配置文件,里面存放的是不同環(huán)境相同的配置項,還有一個跟隨環(huán)境的配置文件,里面存放的是不同環(huán)境的配置項,然后讀取兩個配置文件后,做一個merge,這樣得到的結果就是總共的配置項信息。

有些配置項是必填的,有些配置項的值是一些特殊的值,比如,郵箱,手機號,IP信息等

來看看gonfig是怎么解決這個問題的

安裝gonfig

goget/xiao-ren-wu/gonfig

項目中新建配置目錄,并編寫對應配置文件,在配置目錄同級目錄添加讀取配置文件的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

}

這樣就完成了項目中配置文件的讀取,是不是很簡單?此時讀到的配置形式是conf-{{profile}}.yaml和conf.yaml的總和,如果conf-{{profile}}.yaml中定義的屬性和conf.yaml相同,那么會以conf-{{profile}}.yaml為準

約定

gonfigAPI的簡潔性的原因是因為背后做了很多約束,只有符合約束的配置才能被成功讀取,具體的約束條件如下:

gonfig.Unmarshal會默認讀取文件名稱有前綴conf的文件

通過環(huán)境變量profile作為環(huán)境名稱,如果沒有配置,默認dev。

程序會尋找conf.yaml作為主配置文件,conf-{{profile}}.yaml作為環(huán)境特有配置文件,然后對文件內(nèi)容進行合并

如果conf-{{profile}}.yaml中的屬性和conf.yaml中屬性都有定義,那么會以conf-{{profile}}.yaml為準。

根據(jù)項目定制化配置文件

gonfig.Unmarshal的函數(shù)簽名funcUnmarshal(confDirReadFileDir,vinterface{},ops...Option)error提供很多配置項,供用戶定制化需求,具體的配置信息如下:

更改配置文件名稱前綴FilePrefix(prefixstring)

更改讀取配置文件類型UnmarshalWith(uTypeUnmarshalType)

更改讀取的環(huán)境變量名稱ProfileUseEnv(envName,defaultProfilestring)

自定義設置profileProfileFunc(ffunc()string)

原理篇

gonfig的實現(xià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)

}

大概的原理就是復制了一份用戶傳給函

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論