YAML以数据为中心,使用空白,缩进,分行组织数据,多用于api接口的定义。
- 1 大小写敏感
- 2 使用缩进表示层级关系
- 3 禁止使用tab缩进,只能使用空格键
- 4 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
- 5 使用#表示注释
- 6 字符串可以不用引号标注
读取yaml数据
- name: wanger
age: 24
address: beijing
hobby:
- literature
- social
- name: 冬哥
age: 30
address: chengdu
hobby:
- basketball
- guitar
type YamlDemo struct {
Name string `yaml:"yaml"`
Age int8 `yaml:"age"`
Address string `yaml:"address"`
Hobby []string `yaml:"hobby"`
}
func main() {
file, _ := ioutil.ReadFile("C:/Users/sosmy/Desktop/go/go_code/nats_api/demo.yaml")
var data []YamlDemo
_ = yaml.Unmarshal(file, &data)
for _, v := range data {
fmt.Println("取出值:", v)
}
}
生成yaml文件
type YamlDemo struct {
Name string `yaml:"yaml"`
Age int8 `yaml:"age"`
Address string `yaml:"address"`
Hobby []string `yaml:"hobby"`
}
func main() {
v1 := YamlDemo{
Name: "莉莉周",
Age: 18,
Address: "深圳市",
Hobby: []string{"游泳", "看书"},
}
v2 := YamlDemo{
Name: "莉莉周2",
Age: 17,
Address: "耒阳市",
Hobby: []string{"上网", "玩车"},
}
val := []YamlDemo{v1, v2}
yamlData, _ := yaml.Marshal(&val)
fmt.Println(string(yamlData))
filename := "C:/Users/sosmy/Desktop/go/go_code/nats_api/demo2.yaml"
_ = ioutil.WriteFile(filename, yamlData, 0644)
}
把数据映射在结构体上,写进yaml文件
func main() {
//注意缩进!
str := `
age : 12346
name : aa
`
type P struct {
Name string
Age int
}
var p P
_ = yaml.Unmarshal([]byte(str), &p) //映射到结构体上
filename := "C:/Users/sosmy/Desktop/go/go_code/nats_api/demo3.yaml"
v, _ := yaml.Marshal(&p)
_ = ioutil.WriteFile(filename, v, 0644)
}
把切片数据写入yaml文件
func main() {
str := `
- a
- b
- 12
`
var p []string
_ = yaml.Unmarshal([]byte(str), &p)
b, _ := yaml.Marshal(&p)
filename := "C:/Users/sosmy/Desktop/go/go_code/nats_api/demo4.yaml"
_ = ioutil.WriteFile(filename, b, 0644)
}
把map嵌套map 写入yaml文件
func main() {
// 注意缩进
str := `
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
`
var p map[string]map[string]string
_ = yaml.Unmarshal([]byte(str), &p)
b, _ := yaml.Marshal(&p)
filename := "C:/Users/sosmy/Desktop/go/go_code/nats_api/demo4.yaml"
_ = ioutil.WriteFile(filename, b, 0666)
}
map嵌套list 写入yaml文件
func main() {
str := `
languages:
- Ruby
- Perl
- Python
- c
`
var p map[string][]string
_ = yaml.Unmarshal([]byte(str), &p)
b, _ := yaml.Marshal(&p)
filename := "C:/Users/sosmy/Desktop/go/go_code/nats_api/demo.yaml"
_ = ioutil.WriteFile(filename, b, 0666)
}
list 嵌套list
func main() {
str := `
-
- Ruby
- Perl
- Python
-
- c
- c++
- java
`
var p [][]string
_ = yaml.Unmarshal([]byte(str), &p)
b, _ := yaml.Marshal(&p)
filename := "C:/Users/sosmy/Desktop/go/go_code/nats_api/demo4.yaml"
_ = ioutil.WriteFile(filename, b, 0666)
}
list 嵌套map
func main() {
str := `
-
id: 1
name: huang
-
id: 2
name: liao
`
var p []map[string]string
_ = yaml.Unmarshal([]byte(str), &p)
b, _ := yaml.Marshal(&p)
filename := "C:/Users/sosmy/Desktop/go/go_code/nats_api/demo4.yaml"
_ = ioutil.WriteFile(filename, b, 0666)
}
关于 - + >
- 1 +表示保留文字块末尾的换行
- 2 - 会删除文字块后面的换行
- 3 > 会将文字块后的换行更改成空格,最终成一行!
锚点与引用, * 用来引用锚点
name: &a yaml
book: *a
books:
- java
- *a
- python
输出book: yaml
输出books:[java,yaml,python]
注意*引用部分不能追加内容
func main() {
str := `
name: &a yaml
book: *a
books:
- java
- *a
- python
`
type P struct {
Name string
Book string
Books []string
}
var p P
_ = yaml.Unmarshal([]byte(str), &p)
b, _ := yaml.Marshal(&p)
filename := "C:/Users/sosmy/Desktop/go/go_code/nats_api/demo4.yaml"
_ = ioutil.WriteFile(filename, b, 0666)
}
name: yaml
book: yaml
books:
- java
- yaml
- python
单引号,双引号
# YAML
s1: '内容\n字符串'
s2: "内容\n字符串"
数据类型表示
#YAML
isTrue: true
isTrue: false
12 #整数
014 # 八进制整数
0xC #十六进制整数
13.4 #浮点数
1.2e+34 #指数
.inf空值 #无穷大
#YAML
int: 10
float: 1.23
double: 2.34
# YAML
person: ~
#YAML
iso8601: 2018-05-20t10:59:43.10-05:00
- 日期采用ISO8601的格式yyyy-MM-dd表示
#YAML
date: 2018-05-20
- YAML 允许使用个感叹号!,强制转换数据类型,单叹号通常是自定义类型,双叹号是内置类型
money: !!str
123
date: !Boolean
true
内置类型:
!!int # 整数类型
!!float # 浮点类型
!!bool # 布尔类型
!!str # 字符串类型
!!binary # 也是字符串类型
!!timestamp # 日期时间类型
!!null # 空值
!!set # 集合
!!omap,!!pairs # 键值列表或对象列表
!!seq # 序列,也是列表 !!map # 键值表