網(wǎng)站首頁 編程語言 正文
當(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)工作,下面介紹如何合并多個配置信息。
合并配置
如果配置信息包括包括很多字段,則可能需要維護一個示例文件,并允許用戶提供新的值進行修改。我們可以使用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方法指定后面覆蓋前置配置,讀者還可以通過源碼查看其他的合并方法。
原文鏈接:https://blog.csdn.net/neweastsun/article/details/128358038
相關(guān)推薦
- 2022-03-16 VS2022?安裝.NET4.5目標(biāo)包的方法_實用技巧
- 2022-07-12 純css控制文字顯示隱藏
- 2022-09-19 Redis緩存穿透/擊穿工具類的封裝_Redis
- 2022-07-22 C語言中字符串詳解
- 2022-12-13 C++?Boost?Pool超詳細(xì)講解_C 語言
- 2022-12-21 QT+Quick實現(xiàn)自定義組件的示例詳解_C 語言
- 2022-07-17 SQL?Server使用T-SQL語句批處理_MsSql
- 2022-12-04 WxPython界面如何用pubsub展示進程工作的進度條_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支