Golang 四种配置文件解析:JSON、YAML、INI与TOML实战

今天早睡
今天早睡
发布时间:2026-10-15 | 4人浏览过
原创

在 Golang 开发中,管理外部配置(如数据库连接、服务器参数)是构建灵活系统的必要环节。本文将演示如何使用原生 `encoding/json` 包读取 JSON 配置,利用 `yaml.v2` 解析 YAML 文件,通过 `bufio` 处理传统的 `key=value` 文本格式,以及借助第三方库解析结构化的 TOML 配置。

JSON 配置文件解析

Golang 标准库提供了强大的 encoding/json 包,配合 Struct Tag 可以高效地将 JSON 数据映射到结构体中。此过程主要包含读取文件和反序列化两个关键步骤。

准备配置数据

创建 config/json.json 文件,定义基础结构:

{
"host": "127.0.0.1",
"user": "root",
"password": "123456",
"port": "3306",
"db": "demo"
}

代码实现

通过 ioutil.ReadFile 获取字节流,使用 json.Unmarshal 将其反序列化为结构体变量。以下是完整的读取示例:

// 定义匹配 JSON 结构的 struct
type DbJson struct {
	Host     string `json:"host"`
	User     string `json:"user"`
	Password string `json:"password"`
	Port     string `json:"port"`
	Db       string `json:"db"`
}

func GetJsonConfig() {
	// 1. 读取 json 文件内容
	file, err := ioutil.ReadFile("./config/json.json")
	if err != nil {
		fmt.Println("err1", err)
		return
	}
	db := new(DbJson)

	// 2. 将读取到的 json 文件内容反序列化
	err = json.Unmarshal(file, db)
	if err != nil {
		fmt.Println("err2", err)
		return
	}

	// 验证结果
	fmt.Println(db.Host, db.User, db.Password, db.Port, db.Db)
}

YAML 配置文件解析

YAML 格式简洁且可读性强。在 Go 中,通常使用 gopkg.in/yaml.v2 库进行解析,其用法与 JSON 非常相似。

准备配置数据

创建 config/yml.yml 文件。请注意,yaml 的分隔符冒号后必须保留一个空格,否则可能导致解析失败:

host: 127.0.0.1
user: root
password: 123456
port: 3306
db: demo

代码实现

同样使用 Struct Tag(此处标签为 yaml),调用 yaml.Unmarshal 即可:

import "gopkg.in/yaml.v2"

type DbYml struct {
	Host     string `yaml:"host"`
	User     string `yaml:"user"`
	Password string `yaml:"password"`
	Port     string `yaml:"port"`
	Db       string `yaml:"db"`
}

func GetYmlConfig() {
	file, err := ioutil.ReadFile("./config/yml.yml")
	if err != nil {
		return
	}
	db := new(DbYml)
	err = yaml.Unmarshal(file, db)
	if err != nil {
		return
	}
	fmt.Println(db.Host, db.User, db.Password, db.Port, db.Db)
}

TOML 配置文件解析

TOML 擅长表达层级关系。由于 Go 标准库不包含 TOML 解析器,需引入第三方成熟库,如 github.com/BurntSushi/toml。

准备配置数据

创建 config/toml.toml 文件,示例如下:

[database]
host="127.0.0.1"
user="root"
password="123456"
port=[3306, 3307]
db="demo"

代码实现

toml.DecodeFile 可以直接接收文件路径和结构体指针完成解析,非常方便:

import (
	"github.com/BurntSushi/toml"
	"path/filepath"
)

type Database struct {
	Host     string   `toml:"host"`
	User     string   `toml:"user"`
	Password string   `toml:"password"`
	Port     []int32  `toml:"port"`
	Db       string   `toml:"db"`
}

type DbToml struct {
	Db Database `toml:"database"`
}

func GetTomlConfig() {
	var config DbToml
	// 获取绝对路径
	fileName, err := filepath.Abs("./config/toml.toml")
	if err != nil {
		return
	}
	_, err1 := toml.DecodeFile(fileName, &config)
	if err1 != nil {
		fmt.Println(err1)
		return
	}
	fmt.Println(config.Db.Host, config.Db.User, config.Db.Password, config.Db.Port[0], config.Db.Db)
}

Key=Value 文本配置解析

对于简单的扁平化键值对(类似 Java 的 Properties 文件),无需引入额外库,可直接使用 os 和 bufio 逐行处理。

准备配置数据

创建 config/key.txt 文件:

host=127.0.0.1
user=root
password=123456
port=3306
db=demo

代码实现

核心逻辑为打开文件 -> 循环按行读取 -> 根据等号索引拆分 Key 和 Value:

func GetKeyValue() {
	allConfig := make(map[string]string)
	open, err := os.Open("./config/key.txt")
	if err != nil {
		fmt.Println("err1", err)
		return
	}
	defer open.Close()

	reader := bufio.NewReader(open)
	for {
		line, _, err := reader.ReadLine()
		if err != nil {
			if err == io.EOF {
				break
			}
			return
		}

		s := strings.TrimSpace(string(line))
		index := strings.Index(s, "=")
		if index < 0 || len(strings.TrimSpace(s[:index])) == 0 {
			continue
		}

		key := strings.TrimSpace(s[:index])
		value := strings.TrimSpace(s[index+1:])
		allConfig[key] = value
	}

	for k, v := range allConfig {
		fmt.Println(k, v)
	}
}

以上就是 Golang 常见配置文件读取的详细内容,更多关于 Golang 参数配置的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表