日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Golang合并yaml文件過程逐步講解_Golang

作者:夢想畫家 ? 更新時間: 2023-02-25 編程語言

當前有趨勢使用環境變量代替配置文件,主要是為了方便容器部署,因為文件需要額外文件權限。但環境變量也有缺點,如長度和因數量太多造成的復雜性,另外嵌套也很難實現,此時配置文件則更合適。

本文就介紹Golang讀寫配置文件,以及合并配置獲得最終配置信息。

讀配置

首先準備配置文件config.yaml:

name: test
image: tom.png
environment:
  os: linux
  group: admin
  user: testAdmin
limits:
  cpu: 4
  memory: 512M

為了加載配置,需要定義結構體及標簽,和json標記類似:

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)
}

輸出結果:

Function name: test?? ?Image: tom.png?? ?Envs: 3
Limists: 4, 512M

寫配置

寫文件首先使用接口Marshal把對象序列化為字節數組,然后調用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庫可以快速實現配置文件相關工作,下面介紹如何合并多個配置信息。

合并配置

如果配置信息包括包括很多字段,則可能需要維護一個示例文件,并允許用戶提供新的值進行修改。我們可以使用mergo庫實現合并功能,當然其他庫也可以實現類似功能,該方法支持內存中任何結構體,不一定為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))
}

運行測試輸出結果:

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

欄目分類
最近更新