YAML - Go YAML 处理
YAML 是一种常用的配置文件格式。Go 通过 gopkg.in/yaml.v3 等库支持 YAML 的编解码。掌握 YAML 处理是开发配置管理功能的基础。
基础使用
📝 解析和生成
package main
import (
"fmt"
"gopkg.in/yaml.v3"
)
func main() {
// YAML 字符串
data := `
name: Alice
age: 30
email: alice@example.com
skills:
- Go
- Python
- JavaScript
address:
city: Beijing
district: Chaoyang
`
// 解析到 map
var m map[string]interface{}
if err := yaml.Unmarshal([]byte(data), &m); err != nil {
panic(err)
}
fmt.Printf("Parsed: %+v\n", m)
// 生成 YAML
output, _ := yaml.Marshal(m)
fmt.Println(string(output))
}
结构体绑定
📝 解析到结构体
package main
import (
"fmt"
"gopkg.in/yaml.v3"
)
type Config struct {
Name string `yaml:"name"`
Age int `yaml:"age"`
Email string `yaml:"email"`
Skills []string `yaml:"skills"`
Address Address `yaml:"address"`
}
type Address struct {
City string `yaml:"city"`
District string `yaml:"district"`
}
func main() {
data := `
name: Alice
age: 30
email: alice@example.com
skills:
- Go
- Python
address:
city: Beijing
district: Chaoyang
`
var cfg Config
if err := yaml.Unmarshal([]byte(data), &cfg); err != nil {
panic(err)
}
fmt.Printf("Name: %s\n", cfg.Name)
fmt.Printf("Age: %d\n", cfg.Age)
fmt.Printf("Skills: %v\n", cfg.Skills)
fmt.Printf("Address: %s, %s\n", cfg.Address.City, cfg.Address.District)
// 生成 YAML
output, _ := yaml.Marshal(cfg)
fmt.Println(string(output))
}
文件操作
📝 读写 YAML 文件
package main
import (
"os"
"gopkg.in/yaml.v3"
)
type Config struct {
Server ServerConfig `yaml:"server"`
DB DBConfig `yaml:"database"`
}
type ServerConfig struct {
Host string `yaml:"host"`
Port int `yaml:"port"`
}
type DBConfig struct {
DSN string `yaml:"dsn"`
}
// 读取文件
func LoadConfig(path string) (*Config, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
var cfg Config
if err := yaml.Unmarshal(data, &cfg); err != nil {
return nil, err
}
return &cfg, nil
}
// 保存文件
func SaveConfig(path string, cfg *Config) error {
data, err := yaml.Marshal(cfg)
if err != nil {
return err
}
return os.WriteFile(path, data, 0644)
}