YML
what YML
YAML不是一种标记语言,是一种能够直观的被电脑识别的数据序列化格式,而且容易被人类阅读理解,方便与脚本语言交互,通常是以.yml为后缀的文件。
可以被支持YAML库的不同的编程语言程序导入,一种专门用来写配置文件的语言。可用于如:GO, Java,C/C++, Ruby, Python, Perl, C#, PHP等。
why YML
- YAML易于人们阅读。
- YAML数据在编程语言之间是可移植的。
- YAML匹配敏捷语言的本机数据结构。
- YAML具有一致的模型来支持通用工具。
- YAML支持单程处理。
- YAML具有表现力和可扩展性。
- YAML易于实现和使用。
YML语法
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: wangshi
age: 20
行内写法
people: {name:zhangsan,age: 20}
(4)数组、list、set
用- 值表示数组中的一个元素
pets:
- dog
- pig
- cat
行内写法
pets: [dog,pig,cat]
(5)数组对象
peoples:
- name: zhangsan
age: 22
- name: lisi
age: 20
- {name: wangwu,age: 18}
viper
what viper
viper是go一个强大的流行的配置解决方案的库。viper是spf13的另外一个重量级库。有大量项目都使用该库,比如hugo, docker等。 它基本上可以处理所有类型的配置需求和格式, viper支持功能
- 设置默认配置
- 支持各种配置文件,如JSON,TOML, YAML, HCL, envfile和Java属性配置文件
- 支持监听文件变化以及重新读取配置
- 支持从环境变量读取配置
- 支持从远程配置系统(etcd或Consul)读取配置,并能监听远程配置修改
- 支持从命令行标志Flag读取配置,比如搭配cobra使用
- 支持读取缓冲区数据
viper安装
$ go get github.com/spf13/viper
viper使用
从配置文件读取
app.yml文件
app:
name: viper-test
mode: dev
db:
mysql:
url: "root:root@tcp(127.0.0.1:3306)/stock?charset=utf8mb4&parseTime=True&loc=Local"
redis:
host: 127.0.0.1
port: 6067
db: 0
passwd: 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"))