Golang合并yaml文件過(guò)程逐步講解
當(dāng)前有趨勢(shì)使用環(huán)境變量代替配置文件,主要是為了方便容器部署,因?yàn)槲募枰~外文件權(quán)限。但環(huán)境變量也有缺點(diǎn),如長(zhǎng)度和因數(shù)量太多造成的復(fù)雜性,另外嵌套也很難實(shí)現(xiàn),此時(shí)配置文件則更合適。
本文就介紹Golang讀寫(xiě)配置文件,以及合并配置獲得最終配置信息。
讀配置
首先準(zhǔn)備配置文件config.yaml:
name: test image: tom.png environment: os: linux group: admin user: testAdmin limits: cpu: 4 memory: 512M
為了加載配置,需要定義結(jié)構(gòu)體及標(biāo)簽,和json標(biāo)記類(lèi)似:
type Spec struct { // Name: name of the function Name string `yaml:"name"` // Image: docker image name of the function Image string `yaml:"image"` Environment map[string]string `yaml:"environment,omitempty"` // Limits for the function Limits *FunctionResources `yaml:"limits,omitempty"` } // FunctionResources Memory and CPU type FunctionResources struct { Memory string ` yaml:"memory"` CPU string ` yaml:"cpu"` }
這里僅用yaml代替json,下面解析也同樣使用Unmarshal接口生成對(duì)象:
import ( "fmt" "os" "gopkg.in/yaml.v2" ) func ReadYaml() { bytesOut, err := os.ReadFile("config.yaml") if err != nil { panic(err) } spec := Spec{} if err := yaml.Unmarshal(bytesOut, &spec); err != nil { panic(err) } fmt.Printf("Function name: %s\tImage: %s\tEnvs: %d\n", spec.Name, spec.Image, len(spec.Environment)) fmt.Printf("Limists: %s, %s\n", spec.Limits.CPU, spec.Limits.Memory) }
輸出結(jié)果:
Function name: test Image: tom.png Envs: 3
Limists: 4, 512M
寫(xiě)配置
寫(xiě)文件首先使用接口Marshal把對(duì)象序列化為字節(jié)數(shù)組,然后調(diào)用os方法寫(xiě)yaml文件:
func WriteYaml() { spec := Spec{ Image: "docker.io/functions/figlet:latest", Name: "figlet", } bytesOut, err := yaml.Marshal(spec) if err != nil { panic(err) } err = os.WriteFile("figlet.yaml", bytesOut, os.ModePerm) if err != nil { panic(err) } fmt.Printf("Wrote: figlet.yaml. . OK. \n") }
運(yùn)行程序成功生成figlet.yaml文件并輸出:
Wrote: figlet.yaml. . OK.
使用yaml.v2庫(kù)可以快速實(shí)現(xiàn)配置文件相關(guān)工作,下面介紹如何合并多個(gè)配置信息。
合并配置
如果配置信息包括包括很多字段,則可能需要維護(hù)一個(gè)示例文件,并允許用戶提供新的值進(jìn)行修改。我們可以使用mergo庫(kù)實(shí)現(xiàn)合并功能,當(dāng)然其他庫(kù)也可以實(shí)現(xiàn)類(lèi)似功能,該方法支持內(nèi)存中任何結(jié)構(gòu)體,不一定為YAML:
import "github.com/imdario/mergo" func MergeYaml() { base := Spec{ Image: "docker.io/functions/figlet:latest", Name: "figlet", Environment: map[string]string{"stage": "develop"}, Limits: &FunctionResources{Memory: "512Mi", CPU: "60Mi"}, } production := Spec{ Environment: map[string]string{"stage": "production"}, Limits: &FunctionResources{Memory: "1Gi", CPU: "100Mi"}, } overrides := []Spec{ base, production, } merged := Spec{} for _, override := range overrides { err := mergo.Merge(&merged, override, mergo.WithOverride) if err != nil { panic(err) } } bytesOut, err := yaml.Marshal(merged) if err != nil { panic(err) } fmt.Printf("Merged content: \n\n%s\n", string(bytesOut)) }
運(yùn)行測(cè)試輸出結(jié)果:
Merged content:
name: figlet
image: docker.io/functions/figlet:latest
environment:
stage: production
limits:
memory: 1Gi
cpu: 100Mi
我們?cè)贛erge方法指定后面覆蓋前置配置,讀者還可以通過(guò)源碼查看其他的合并方法。
到此這篇關(guān)于Golang合并yaml文件過(guò)程逐步講解的文章就介紹到這了,更多相關(guān)Golang合并yaml內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go原子級(jí)內(nèi)存操作實(shí)現(xiàn)
原子級(jí)內(nèi)存操作是在多線程并發(fā)執(zhí)行時(shí),能夠確保某個(gè)內(nèi)存操作是不可中斷的操作,本文主要介紹了go原子級(jí)內(nèi)存操作實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02GoLang中的互斥鎖Mutex和讀寫(xiě)鎖RWMutex使用教程
RWMutex是一個(gè)讀/寫(xiě)互斥鎖,在某一時(shí)刻只能由任意數(shù)量的reader持有或者一個(gè)writer持有。也就是說(shuō),要么放行任意數(shù)量的reader,多個(gè)reader可以并行讀;要么放行一個(gè)writer,多個(gè)writer需要串行寫(xiě)2023-01-01Golang defer延遲語(yǔ)句的實(shí)現(xiàn)
defer擁有注冊(cè)延遲調(diào)用的機(jī)制,本文主要介紹了Golang defer延遲語(yǔ)句的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07Go語(yǔ)言學(xué)習(xí)筆記之文件讀寫(xiě)操作詳解
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言對(duì)文件進(jìn)行讀寫(xiě)操作的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下2022-05-05Go定時(shí)器的三種實(shí)現(xiàn)方式示例詳解
這篇文章主要為大家介紹了Go定時(shí)器的三種實(shí)現(xiàn)方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12