持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
前言
配置文件是一个项目中必不可少的一个内容。常用配置文件格式有 json 、yaml、xml 等文件,这里主要记录下解析现有的 YAML 文件或将现有的 Go 结构转换为 YAML。
从 Go 结构体转换 YAML
首先创建一个基本的项目:
mkdir demo-go
cd demo-go
go mod init demo-go
然后在文件中创建一个入口文件 main.go
type MyConfig struct {
Name string
Port int
}
func main(){
c:=Myconfig {
Name :"demo-go",
Port: 8080
}
fmt.Println(c)
}
一段简单的代码; 创建一个结构,添加一些数据,然后打印出来。 很简单的完成第一步工作。现在我们需要配置一些信息在配置文件中,配置文件以 YAML 格式保存的关键信息。 为此,我们将使用 go-yaml 包。首先,我们需要安装它:
go get gopkg.in/yaml.v3
接下来,在有需要使用解析yaml 文件的地方引入包,然后让它工作。 然后就可以调用其提供的方法
import "gopkg.in/yaml.v3"
func main(){
c:=Myconfig {
Name :"demo-go",
Port: 8080
}
conf, err := yaml.Marshal(c)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(conf))
}
在这里,我们对 go-yaml 包的要求是获取我们的结构并将其转换为 YAML 输出。 请注意,这里的 conf 以 []byte 形式返回; 在 fmt 打印结果之前,我们需要将其转换为字符串。
从 yaml 转换 go 结构体
为了将 YAML 文件的内容转换回我们的 MyConfig 结构,我们需要使用 go-yaml 包的一些说明来注释我们的结构的定义。 为此,我们需要为每个结构字段指定输入 tag 名称:
type MyConfig struct {
Name string `yaml:"name"`
Port int `yaml:"port"`
}
这些 tag 可以将定义 YAML 中的键名和结构中相应的字段名的映射。 当 YAML 文件被“解组”(即转换为结构)时,这些 tag 用于正确填充结构。 解组文件的代码如下所示:
if err := yaml.Unmarshal(f, &c); err != nil {
log.Fatal(err)
}
yaml 中嵌套格式转换 Go 结构体
很多配置项中可能会遇到嵌套项,不一定都是直接的key-value ,可能value 又是一个对象或者数组。第三方包 mapstructure 可以很好支持这个类型。还是和之前一样需要定义好每个字段的 tag 说明。
type MyConfig struct {
Port int `mapstructure:"port"`
Name string `mapstructure:"name"`
Clients []string `mapstructure:"clients"`
}
具体的用法:
var c MyConfig
var raw interface{}
if err := yaml.Unmarshal(f, &raw); err != nil {
log.Fatal(err)
}