Golang 四种配置文件解析:JSON、YAML、INI与TOML实战
在 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 参数配置的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









