耐心和持久胜过激烈和狂热。
哈喽大家好,我是陈明勇,本文分享的内容是 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