YAML不是一种标记语言,是一种能够直观的被电脑识别的数据序列化格式,而且容易被人类阅读理解,方便与脚本语言交互,通常是以.yml为后缀的文件。
可以被支持YAML库的不同的编程语言程序导入,一种专门用来写配置文件的语言。可用于如:GO, Java,C/C++, Ruby, Python, Perl, C#, PHP等。
1、规则
- k: v 表示键值对关系,冒号后面必须有一个空格
- 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的
- 大小写敏感
- 缩进时不允许使用Tab键,只允许使用空格。
- 松散表示,java中对于驼峰命名法,可用原名或使用-代替驼峰,如java中的lastName属性,在yml中使用lastName或 last-name都可正确映射。
2、键值关系
普通的值(数字、字符串、布尔)、日期、对象、数组、集合等
(1)普通值
单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name1: zhangsan
name2: 'zhangsan \n lisi'
name3: "zhangsan \n lisi"
age: 18
flag: true
(2)日期
date: 2023/01/01
(3)对象(属性和值)、Map(键值对)
people:name: wangshiage: 20
行内写法
people: {name:zhangsan,age: 20}
(4)数组、list、set
用- 值表示数组中的一个元素
pets:- dog- pig- cat
行内写法
pets: [dog,pig,cat]
(5)数组对象
peoples:- name: zhangsanage: 22- name: lisiage: 20- {name: wangwu,age: 18}
viper是go一个强大的流行的配置解决方案的库。viper是spf13的另外一个重量级库。有大量项目都使用该库,比如hugo, docker等。 它基本上可以处理所有类型的配置需求和格式, viper支持功能
$ go get github.com/spf13/viper
app.yml文件
app:name: viper-testmode: devdb:mysql:url: "root:root@tcp(127.0.0.1:3306)/stock?charset=utf8mb4&parseTime=True&loc=Local"redis:host: 127.0.0.1port: 6067db: 0passwd: 123456
初始化配置
func InitConfig() (*viper.Viper, error) {v := viper.New()v.AddConfigPath(".") // 添加配置文件搜索路径,点号为当前目录v.AddConfigPath("./configs") // 添加多个搜索目录v.SetConfigType("yaml") // 如果配置文件没有后缀,可以不用配置v.SetConfigName("app.yml") // 文件名,没有后缀// v.SetConfigFile("configs/app.yml")// 读取配置文件if err := v.ReadInConfig(); err == nil {log.Printf("use config file -> %s\n", v.ConfigFileUsed())} else {return nil,err}return v, nil
}
首先这里我们添加一个配置文件搜索路径,点号表示当前路径,搜索路径可以添加多个。
然后设置了配置文件类型,这里我们设置文件类型为yaml。
接着我们设置了配置文件名称,这个文件可以从配置的搜索路径从查找。
最后我们通过提供的ReadInConfig()函数读取配置文件。
读取配置文件
// 通过.号来区分不同层级,来获取配置值
log.Printf("app.mode=%s\n", v.Get("app.mode"))
log.Printf("db.mysql.url=%s\n", v.Get("db.mysql.url"))
log.Printf("db.redis.host=%s\n", v.GetString("db.redis.host"))
log.Printf("db.redis.port=%d\n", v.GetInt("db.redis.port"))// 使用Sub获取子配置,然后获取配置值
v2 := v.Sub("db")
log.Printf("db.mysql.url:%s\n", v2.Sub("mysql").GetString("url"))
log.Printf("db.redis.host:%s\n", v2.Sub("redis").GetString("host"))
log.Printf("db.redis.port:%s\n", v2.Sub("redis").GetInt("port"))