← Now 时间 | CSV →

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