W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
?gcfg
?組件采用接口化設(shè)計,默認提供的是基于文件系統(tǒng)的接口實現(xiàn)。支持的數(shù)據(jù)文件格式包括: ?JSON/XML/YAML(YML)/TOML/INI
?,項目中開發(fā)者可以靈活地選擇自己熟悉的配置文件格式來進行配置管理。
配置對象我們推薦使用單例方式獲取,單例對象將會按照文件后綴?toml/yaml/yml/json/ini/xml
?文自動檢索配置文件。默認情況下會自動檢索配置文件?config.toml/yaml/yml/json/ini/xml
?并緩存,配置文件在外部被修改時將會自動刷新緩存。
如果想要自定義文件格式,可以通過?SetFileName
?方法修改默認讀取的配置文件名稱(如:?default.yaml
?, ?default.json
?, ?default.xml
?等等)。例如,我們可以通過以下方式讀取?default.yaml
?配置文件中的數(shù)據(jù)庫?database
?配置項。
// 設(shè)置默認配置文件,默認讀取的配置文件設(shè)置為 default.yaml
g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetFileName("default.yaml")
// 后續(xù)讀取時將會讀取到 default.yaml 配置文件內(nèi)容,
g.Cfg().Get("database")
文件可以是一個具體的文件名稱或者完整的文件絕對路徑。
我們可以通過多種方式修改默認文件名稱:
SetFileName
?修改。
gf.gcfg.file
?。
GF_GCFG_FILE
?。
假如我們的執(zhí)行程序文件為?main
?,那么可以通過以下方式修改配置管理器的配置文件目錄(?Linux
?下):
1、通過單例模式
g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetFileName("default.yaml")
2、通過命令行啟動參數(shù)
./main --gf.gcfg.file=config.prod.toml
3、通過環(huán)境變量(常用在容器中)
GF_GCFG_FILE=config.prod.toml; ./main
genv
?模塊來修改環(huán)境變量: genv.Set("GF_GCFG_FILE", "config.prod.toml")
?gcfg
?配置管理器支持非常靈活的多目錄自動搜索功能,通過?SetPath
?可以修改目錄管理目錄為唯一的目錄地址,同時,我們推薦通過?AddPath
?方法添加多個搜索目錄,配置管理器底層將會按照添加目錄的順序作為優(yōu)先級進行自動檢索。直到檢索到一個匹配的文件路徑為止,如果在所有搜索目錄下查找不到配置文件,那么會返回失敗。
?gcfg
?配置管理對象初始化時,默認會自動添加以下配置文件搜索目錄:
1、當前工作目錄及其下的?config
?、?manifest/config
?目錄:例如當前的工作目錄為?/home/www
?時,將會添加:
/home/www
?/home/www/config
?/home/www/manifest/config
?2、當前可執(zhí)行文件所在目錄及其下的?config
?、?manifest/config
?目錄:例如二進制文件所在目錄為?/tmp
?時,將會添加:
/tmp
?/tmp/config
?/tmp/manifest/config
?3、當前?main
?源代碼包所在目錄及其下的?config
?、?manifest/config
?目錄(僅對源碼開發(fā)環(huán)境有效):例如?main
?包所在目錄為?/home/john/workspace/gf-app
?時,將會添加:
/home/john/workspace/gf-app
?/home/john/workspace/gf-app/config
?/home/john/workspace/gf-app/manifest/config
?注意這里修改的參數(shù)必須是一個目錄,不能是文件路徑。
我們可以通過以下方式修改配置管理器的配置文件搜索目錄,配置管理對象將會只在該指定目錄執(zhí)行配置文件檢索:
SetPath
?方法手動修改;
gf.gcfg.path
?;
GF_GCFG_PATH
?;
假如我們的執(zhí)行程序文件為?main
?,那么可以通過以下方式修改配置管理器的配置文件目錄(?Linux
?下):
1、通過單例模式
g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetPath("/opt/config")
2、通過命令行啟動參數(shù)
./main --gf.gcfg.path=/opt/config/
3、通過環(huán)境變量(常用在容器中)
GF_GCFG_PATH=/opt/config/; ./main
genv
?模塊來修改環(huán)境變量: genv.Set("GF_GCFG_PATH", "/opt/config")
?gcfg
?包也支持直接內(nèi)容配置,而不是讀取配置文件,常用于程序內(nèi)部動態(tài)修改配置內(nèi)容。通過以下包配置方法實現(xiàn)全局的配置:
func (c *AdapterFile) SetContent(content string, file ...string)
func (c *AdapterFile) GetContent(file ...string) string
func (c *AdapterFile) RemoveContent(file ...string)
func (c *AdapterFile) ClearContent()
需要注意的是該配置是全局生效的,并且優(yōu)先級會高于讀取配置文件。因此,假如我們通過?SetContent("v = 1", "config.toml")
?配置了?config.toml
?的配置內(nèi)容,并且也同時存在?config.toml
?配置文件,那么只會使用到?SetContent
?的配置內(nèi)容,而配置文件內(nèi)容將會被忽略。
在默認提供的文件系統(tǒng)接口實現(xiàn)下,?gcfg
?組件支持按層級獲取配置數(shù)據(jù),層級訪問默認通過英文?.
?號指定,其中?pattern
?參數(shù)和 通用編解碼?-gjson
? 的?pattern
?參數(shù)一致。例如以下配置(?config.yaml
?):
server:
address: ":8199"
serverRoot: "resource/public"
database:
default:
link: "mysql:root:12345678@tcp(127.0.0.1:3306)/focus"
debug: true
例如針對以上配置文件內(nèi)容的層級讀?。?/p>
// :8199
g.Cfg().Get("server.address")
// true
g.Cfg().Get("database.default.debug")
大家都知道,在Golang里面,?map/slice
?類型其實是一個”引用類型”(也叫”指針類型”),因此當你對這種類型的變量 鍵值對/索引項 進行修改時,會同時修改到其對應的底層數(shù)據(jù)。從效率上考慮,?gcfg
?包某些獲取方法返回的數(shù)據(jù)類型為?map/slice
?時,沒有對其做值拷貝,因此當你對返回的數(shù)據(jù)進行修改時,會同時修改?gcfg
?對應的底層數(shù)據(jù)。
例如:
// For testing/example only.
content := `{"map":{"key":"value"}, "slice":[59,90]}`
gcfg.SetContent(content)
defer gcfg.RemoveContent()
m := g.Cfg().GetMap("map")
fmt.Println(m)
// Change the key-value pair.
m["key"] = "john"
// It changes the underlying key-value pair.
fmt.Println(g.Cfg().GetMap("map"))
s := g.Cfg().GetArray("slice")
fmt.Println(s)
// Change the value of specified index.
s[0] = 100
// It changes the underlying slice.
fmt.Println(g.Cfg().GetArray("slice"))
// output:
// map[key:value]
// map[key:john]
// [59 90]
// [100 90]
配置管理器使用了緩存機制,當配置文件第一次被讀取后會被緩存到內(nèi)存中,下一次讀取時將會直接從緩存中獲取,以提高性能。同時,配置管理器提供了對配置文件的自動檢測更新機制,當配置文件在外部被修改后,配置管理器能夠即時地刷新配置文件的緩存內(nèi)容。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: