侧边栏壁纸
博主头像
ERSHI的个人网站

记录一下

  • 累计撰写 7 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Go语言操作YAML文件

ERSHI
2025-09-07 / 0 评论 / 0 点赞 / 4 阅读 / 0 字

如何在 Golang 中读写和修改 YAML 文件

YAML(YAML Ain’t Markup Language)是一种人类友好的数据序列化格式,常用于配置文件和数据交换。本文将介绍如何在 Go 语言中读取、写入和修改 YAML 文件,以及如何创建初始 YAML 文件。

准备工作

首先,我们需要安装 Go 语言的 YAML 处理库。Go 标准库中没有直接支持 YAML 的包,但有许多优秀的第三方库可供选择。这里我们使用最流行的 gopkg.in/yaml.v3

在终端中运行以下命令安装:

go get gopkg.in/yaml.v3

创建初始 YAML 文件

让我们先创建一个简单的 Go 程序来生成一个初始的 YAML 配置文件:

package main

import (
	"fmt"
	"gopkg.in/yaml.v3"
	"os"
)

// 定义一个结构体来表示配置数据
type Config struct {
	Server struct {
		Host string `yaml:"host"`    // 服务器主机地址
		Port int    `yaml:"port"`    // 服务器端口号
	} `yaml:"server"`
	Database struct {
		Name     string `yaml:"name"`     // 数据库名称
		User     string `yaml:"user"`     // 数据库用户名
		Password string `yaml:"password"` // 数据库密码
	} `yaml:"database"`
}

func main() {
	// 创建配置实例并设置默认值
	config := Config{}
	config.Server.Host = "localhost"
	config.Server.Port = 8080
	config.Database.Name = "mydb"
	config.Database.User = "admin"
	config.Database.Password = "secret"

	// 将结构体转换为 YAML 格式
	data, err := yaml.Marshal(&config)
	if err != nil {
		fmt.Printf("Error while Marshaling: %v", err)
		return
	}

	// 将 YAML 数据写入文件
	err = os.WriteFile("config.yaml", data, 0644)
	if err != nil {
		fmt.Printf("Error writing YAML file: %v", err)
		return
	}

	fmt.Println("Initial YAML file created successfully!")
}

运行此程序后,会在当前目录生成一个 config.yaml 文件,内容如下:

server:
  host: localhost
  port: 8080
database:
  name: mydb
  user: admin
  password: secret

读取 YAML 文件

现在让我们看看如何读取这个 YAML 文件:

package main

import (
	"fmt"
	"gopkg.in/yaml.v3"
	"os"
)

type Config struct {
	Server struct {
		Host string `yaml:"host"`
		Port int    `yaml:"port"`
	} `yaml:"server"`
	Database struct {
		Name     string `yaml:"name"`
		User     string `yaml:"user"`
		Password string `yaml:"password"`
	} `yaml:"database"`
}

func main() {
	// 读取 YAML 文件内容
	data, err := os.ReadFile("config.yaml")
	if err != nil {
		fmt.Printf("Error reading YAML file: %v", err)
		return
	}

	// 创建配置实例
	config := Config{}

	// 将 YAML 数据解析到结构体中
	err = yaml.Unmarshal(data, &config)
	if err != nil {
		fmt.Printf("Error parsing YAML file: %v", err)
		return
	}

	// 打印配置信息
	fmt.Printf("Server: %s:%d\n", config.Server.Host, config.Server.Port)
	fmt.Printf("Database: %s (User: %s, Password: %s)\n", 
		config.Database.Name, config.Database.User, config.Database.Password)
}

修改并写入 YAML 文件

有时候我们需要修改配置并保存回文件:

package main

import (
	"fmt"
	"gopkg.in/yaml.v3"
	"os"
)

type Config struct {
	Server struct {
		Host string `yaml:"host"`
		Port int    `yaml:"port"`
	} `yaml:"server"`
	Database struct {
		Name     string `yaml:"name"`
		User     string `yaml:"user"`
		Password string `yaml:"password"`
	} `yaml:"database"`
}

func main() {
	// 读取现有的 YAML 文件
	data, err := os.ReadFile("config.yaml")
	if err != nil {
		fmt.Printf("Error reading YAML file: %v", err)
		return
	}

	// 解析 YAML 数据
	config := Config{}
	err = yaml.Unmarshal(data, &config)
	if err != nil {
		fmt.Printf("Error parsing YAML file: %v", err)
		return
	}

	// 修改配置值
	config.Server.Port = 9090           // 更改端口号
	config.Database.Password = "newsecret" // 更改密码

	// 将修改后的配置转换回 YAML 格式
	newData, err := yaml.Marshal(&config)
	if err != nil {
		fmt.Printf("Error while Marshaling: %v", err)
		return
	}

	// 将新数据写回文件
	err = os.WriteFile("config.yaml", newData, 0644)
	if err != nil {
		fmt.Printf("Error writing YAML file: %v", err)
		return
	}

	fmt.Println("YAML file updated successfully!")
}

处理更复杂的 YAML 结构

YAML 文件可能包含数组、嵌套对象等复杂结构。以下是一个更复杂的示例:

package main

import (
	"fmt"
	"gopkg.in/yaml.v3"
	"os"
)

// 定义更复杂的配置结构
type ComplexConfig struct {
	AppName string   `yaml:"app_name"`           // 应用程序名称
	Users   []User   `yaml:"users"`              // 用户列表
	Options []string `yaml:"options,flow"`       // 选项列表,使用流样式
}

type User struct {
	ID       int      `yaml:"id"`                // 用户ID
	Name     string   `yaml:"name"`              // 用户名
	Roles    []string `yaml:"roles"`             // 用户角色
	Metadata struct {
		Created string `yaml:"created"`          // 创建时间
		Active  bool   `yaml:"active"`           // 是否活跃
	} `yaml:"metadata"`
}

func main() {
	// 创建复杂配置
	config := ComplexConfig{
		AppName: "MyApplication",
		Users: []User{
			{
				ID:    1,
				Name:  "Alice",
				Roles: []string{"admin", "user"},
			},
			{
				ID:    2,
				Name:  "Bob",
				Roles: []string{"user"},
			},
		},
		Options: []string{"option1", "option2", "option3"},
	}

	// 设置元数据
	config.Users[0].Metadata.Created = "2023-01-01"
	config.Users[0].Metadata.Active = true
	config.Users[1].Metadata.Created = "2023-01-02"
	config.Users[1].Metadata.Active = false

	// 转换为 YAML
	data, err := yaml.Marshal(&config)
	if err != nil {
		fmt.Printf("Error while Marshaling: %v", err)
		return
	}

	// 写入文件
	err = os.WriteFile("complex_config.yaml", data, 0644)
	if err != nil {
		fmt.Printf("Error writing YAML file: %v", err)
		return
	}

	fmt.Println("Complex YAML file created successfully!")
}

生成的 complex_config.yaml 文件内容如下:

app_name: MyApplication
users:
  - id: 1
    name: Alice
    roles:
      - admin
      - user
    metadata:
      created: "2023-01-01"
      active: true
  - id: 2
    name: Bob
    roles:
      - user
    metadata:
      created: "2023-01-02"
      active: false
options: [option1, option2, option3]

错误处理最佳实践

在实际应用中,我们应该更仔细地处理错误:

package main

import (
	"fmt"
	"gopkg.in/yaml.v3"
	"os"
)

type Config struct {
	Server struct {
		Host string `yaml:"host"`
		Port int    `yaml:"port"`
	} `yaml:"server"`
}

func readYAML(filename string) (*Config, error) {
	data, err := os.ReadFile(filename)
	if err != nil {
		return nil, fmt.Errorf("failed to read file: %w", err)
	}

	var config Config
	err = yaml.Unmarshal(data, &config)
	if err != nil {
		return nil, fmt.Errorf("failed to parse YAML: %w", err)
	}

	return &config, nil
}

func writeYAML(filename string, config *Config) error {
	data, err := yaml.Marshal(config)
	if err != nil {
		return fmt.Errorf("failed to marshal YAML: %w", err)
	}

	err = os.WriteFile(filename, data, 0644)
	if err != nil {
		return fmt.Errorf("failed to write file: %w", err)
	}

	return nil
}

func main() {
	// 读取配置
	config, err := readYAML("config.yaml")
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	// 修改配置
	config.Server.Port = 9090

	// 写回配置
	err = writeYAML("config.yaml", config)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	fmt.Println("Configuration updated successfully!")
}

总结

通过本文,学习了如何在 Go 语言中:

  1. 使用 gopkg.in/yaml.v3 库处理 YAML 文件
  2. 创建初始 YAML 配置文件
  3. 读取和解析现有的 YAML 文件
  4. 修改 YAML 数据并写回文件
  5. 处理复杂的 YAML 结构,包括数组和嵌套对象
  6. 实现良好的错误处理实践

YAML 是一种非常流行的配置文件格式,掌握在 Go 中处理 YAML 文件的技能对于开发配置驱动的应用程序非常重要。记得在实际项目中适当处理错误,并根据需要添加更多的数据验证。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区