耐心和持久胜过激烈和狂热。

哈喽大家好,我是陈明勇,本文分享的内容是 Go 读取 YAML 配置文件的两种方式。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

前言
YAML

yaml.v3 包

yaml.v3Goyamlyamlyaml.v3
go get gopkg.in/yaml.v3
复制代码

读取 yaml 文件

yaml 测试文件内容:

mysql:
  url: 127.0.0.1
  port: 3306
redis:
  host: 127.0.0.1
  port: 6379
复制代码
yamlMap
import (
    "fmt"
    "gopkg.in/yaml.v3"
    "os"
)
type Config struct {
    Mysql Mysql `json:"mysql"`
    Redis Redis `json:"redis"`
}
type Mysql struct {
    Url  string
    Port int
}
type Redis struct {
    Host string
    Port int
}
func main() {
    dataBytes, err := os.ReadFile("test.yaml")
    if err != nil {
        fmt.Println("读取文件失败:", err)
        return
    }
    fmt.Println("yaml 文件的内容: \n", string(dataBytes))
    config := Config{}
    err = yaml.Unmarshal(dataBytes, &config)
    if err != nil {
        fmt.Println("解析 yaml 文件失败:", err)
        return
    }
    fmt.Printf("config → %+v\n", config) // config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}
    mp := make(map[string]any, 2)
    err = yaml.Unmarshal(dataBytes, mp)
    if err != nil {
        fmt.Println("解析 yaml 文件失败:", err)
        return
    }
    fmt.Printf("map → %+v", config) // config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}
}
复制代码

执行结果:

yaml 文件的内容:
 mysql:
  url: 127.0.0.1
  port: 3306
redis:
  host: 127.0.0.1
  port: 6379
config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}
map → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}
复制代码
osReadFile[]byteyamlUnmarshal(in []byte, out interface{})Configconfigmpmap

viper 包

viperjsonyamlpropertiesviper
go get github.com/spf13/viper
复制代码

读取 yaml 文件

yaml 测试文件内容:

mysql:
  url: 127.0.0.1
  port: 3306
redis:
  host: 127.0.0.1
  port: 6379
复制代码

代码示例:

import (
    "fmt"
    "github.com/spf13/viper"
)
func main() {
    // 设置配置文件的名字
    viper.SetConfigName("test")
    // 设置配置文件的类型
    viper.SetConfigType("yaml")
    // 添加配置文件的路径,指定 config 目录下寻找
    viper.AddConfigPath("./config")
    // 寻找配置文件并读取
    err := viper.ReadInConfig()
    if err != nil {
            panic(fmt.Errorf("fatal error config file: %w", err))
    }
    fmt.Println(viper.Get("mysql"))     // map[port:3306 url:127.0.0.1]
    fmt.Println(viper.Get("mysql.url")) // 127.0.0.1
}
复制代码
SetConfigName
SetConfigType
AddConfigPath
ReadInConfig
Getkeyvalue
小结
yaml.v3viperviper