前言
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