Golang合并yaml文件過程逐步講解
當(dāng)前有趨勢使用環(huán)境變量代替配置文件,主要是為了方便容器部署,因為文件需要額外文件權(quán)限。但環(huán)境變量也有缺點,如長度和因數(shù)量太多造成的復(fù)雜性,另外嵌套也很難實現(xiàn),此時配置文件則更合適。
本文就介紹Golang讀寫配置文件,以及合并配置獲得最終配置信息。
讀配置
首先準(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)記類似:
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接口生成對象:
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
寫配置
寫文件首先使用接口Marshal把對象序列化為字節(jié)數(shù)組,然后調(diào)用os方法寫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")
}
運行程序成功生成figlet.yaml文件并輸出:
Wrote: figlet.yaml. . OK.
使用yaml.v2庫可以快速實現(xiàn)配置文件相關(guān)工作,下面介紹如何合并多個配置信息。
合并配置
如果配置信息包括包括很多字段,則可能需要維護(hù)一個示例文件,并允許用戶提供新的值進(jìn)行修改。我們可以使用mergo庫實現(xiàn)合并功能,當(dāng)然其他庫也可以實現(xiàn)類似功能,該方法支持內(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))
}
運行測試輸出結(jié)果:
Merged content:
name: figlet
image: docker.io/functions/figlet:latest
environment:
stage: production
limits:
memory: 1Gi
cpu: 100Mi
我們在Merge方法指定后面覆蓋前置配置,讀者還可以通過源碼查看其他的合并方法。
到此這篇關(guān)于Golang合并yaml文件過程逐步講解的文章就介紹到這了,更多相關(guān)Golang合并yaml內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go Resiliency庫中timeout實現(xiàn)原理及源碼解析
Go-Resiliency庫中的timeout是一種基于協(xié)程的超時機制,通過創(chuàng)建協(xié)程來執(zhí)行任務(wù)并設(shè)置超時時間,若任務(wù)執(zhí)行時間超時則中止協(xié)程并返回錯誤,需要詳細(xì)了解可以參考下文2023-05-05
Go項目實現(xiàn)優(yōu)雅關(guān)機與平滑重啟功能
無論是優(yōu)雅關(guān)機還是優(yōu)雅重啟歸根結(jié)底都是通過監(jiān)聽特定系統(tǒng)信號,然后執(zhí)行一定的邏輯處理保障當(dāng)前系統(tǒng)正在處理的請求被正常處理后再關(guān)閉當(dāng)前進(jìn)程,這篇文章主要介紹了Go實現(xiàn)優(yōu)雅關(guān)機與平滑重啟 ,需要的朋友可以參考下2022-10-10
Go|使用Options模式和建造者模式創(chuàng)建對象實戰(zhàn)
這篇文章主要介紹了Go使用Options模式和建造者模式創(chuàng)建對象實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

