golang gopkg.in/yaml.v3 yaml 解析、序列化工具
在日常开发中,配置文件是非常常见的需求,而 YAML 以其简洁、可读性强的格式被广泛应用于配置管理中。在 Go 语言中,常用的解析和序列化 YAML 的库是 gopkg.in/yaml.v3。本文将介绍如何使用该库进行 YAML 文件的读取、解析和写入操作。
一、安装依赖
在项目中使用之前,需要通过 go get 安装依赖:
复制
展开
go get gopkg.in/yaml.v3
二、基本用法
假设我们有如下配置文件 config.yaml:
复制
展开
app:
name: "myapp"
port: 8080
debug: true
database:
host: "localhost"
port: 3306
user: "root"
password: "123456"
我们定义一个对应的结构体来映射:
复制
展开
package main
import (
"fmt"
"os"
"gopkg.in/yaml.v3"
)
type Config struct {
App struct {
Name string `yaml:"name"`
Port int `yaml:"port"`
Debug bool `yaml:"debug"`
} `yaml:"app"`
Database struct {
Host string `yaml:"host"`
Port int `yaml:"port"`
User string `yaml:"user"`
Password string `yaml:"password"`
} `yaml:"database"`
}
func main() {
// 读取文件
data, err := os.ReadFile("config.yaml")
if err != nil {
panic(err)
}
// 解析 YAML
var cfg Config
if err := yaml.Unmarshal(data, &cfg); err != nil {
panic(err)
}
fmt.Printf("App Name: %s, Port: %d, Debug: %v\n", cfg.App.Name, cfg.App.Port, cfg.App.Debug)
fmt.Printf("Database: %s:%d user=%s\n", cfg.Database.Host, cfg.Database.Port, cfg.Database.User)
// 修改配置并序列化回 YAML
cfg.App.Debug = false
out, err := yaml.Marshal(&cfg)
if err != nil {
panic(err)
}
fmt.Println("Updated YAML:")
fmt.Println(string(out))
}
运行结果:
复制
展开
App Name: myapp, Port: 8080, Debug: true
Database: localhost:3306 user=root
Updated YAML:
app:
name: myapp
port: 8080
debug: false
database:
host: localhost
port: 3306
user: root
password: "123456"
三、常见技巧
-
忽略字段 使用
yaml:"-"可以在序列化和反序列化时跳过某些字段。 -
处理 map 或 interface 如果结构体不确定,可以使用
map[string]interface{}来动态解析。 -
多文档 YAML
yaml.Decoder支持逐个解析多文档 YAML 文件。
复制
展开
---
id: 1
name: "Alice"
---
id: 2
name: "Bob"
复制
展开
dec := yaml.NewDecoder(strings.NewReader(yamlData))
for {
var item map[string]interface{}
if err := dec.Decode(&item); err != nil {
break
}
fmt.Println(item)
}
四、总结
- gopkg.in/yaml.v3 是 Go 中处理 YAML 的主流库。
- 提供
Unmarshal和Marshal两个核心函数,分别用于解析和序列化。 - 支持结构体映射、map 动态解析以及多文档 YAML 处理。
在实际项目中,结合 配置管理、微服务应用、CI/CD 流程 等场景,YAML 配置的解析与写入是必不可少的技能。
作者:https://blog.xn--rpv331d.com/望舒
链接:https://blog.xn--rpv331d.com/望舒/blog/119
转载注意保留文章出处...
No data
