Golang合并yaml文件过程逐步讲解

 更新时间:2023年01月10日 10:24:59   作者:梦想画家  
之前一直从事java开发,习惯了使用yaml文件的格式,尤其是清晰的层次结构、注释,下面这篇文章主要给大家介绍了关于Golang合并yaml文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

当前有趋势使用环境变量代替配置文件,主要是为了方便容器部署,因为文件需要额外文件权限。但环境变量也有缺点,如长度和因数量太多造成的复杂性,另外嵌套也很难实现,此时配置文件则更合适。

本文就介绍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方法指定后面覆盖前置配置,读者还可以通过源码查看其他的合并方法。

到此这篇关于Golang合并yaml文件过程逐步讲解的文章就介绍到这了,更多相关Golang合并yaml内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang中的深拷贝与浅拷贝使用

    Golang中的深拷贝与浅拷贝使用

    本文主要介绍了Golang中的深拷贝与浅拷贝使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Golang易错知识点汇总

    Golang易错知识点汇总

    这篇文章汇总了在开发和刷面试题过程中遇到的Golang容易搞错的知识点,关键部分也都为大家写了代码示例,感兴趣的小伙伴可以了解一下
    2022-09-09
  • go原子级内存操作实现

    go原子级内存操作实现

    原子级内存操作是在多线程并发执行时,能够确保某个内存操作是不可中断的操作,本文主要介绍了go原子级内存操作实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • GoLang中的互斥锁Mutex和读写锁RWMutex使用教程

    GoLang中的互斥锁Mutex和读写锁RWMutex使用教程

    RWMutex是一个读/写互斥锁,在某一时刻只能由任意数量的reader持有或者一个writer持有。也就是说,要么放行任意数量的reader,多个reader可以并行读;要么放行一个writer,多个writer需要串行写
    2023-01-01
  • Golang defer延迟语句的实现

    Golang defer延迟语句的实现

    defer拥有注册延迟调用的机制,本文主要介绍了Golang defer延迟语句的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Go语言学习笔记之文件读写操作详解

    Go语言学习笔记之文件读写操作详解

    这篇文章主要为大家详细介绍了Go语言对文件进行读写操作的方法,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-05-05
  • Go语言中的函数详解

    Go语言中的函数详解

    函数是基本的代码块,用于执行一个任务。本文详细讲解了Go语言中的函数,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • go env环境变量配置的使用

    go env环境变量配置的使用

    在安装和使用Go时,必须要正确地配置环境变量,本文主要介绍了go env环境变量配置的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Go GORM版本2.0新特性介绍

    Go GORM版本2.0新特性介绍

    这篇文章主要为大家介绍了Go GORM版本2.0新特性的使用示例介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go定时器的三种实现方式示例详解

    Go定时器的三种实现方式示例详解

    这篇文章主要为大家介绍了Go定时器的三种实现方式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论