前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >go yaml 语法学习

go yaml 语法学习

作者头像
solate
发布于 2022-05-13 10:44:59
发布于 2022-05-13 10:44:59
1.9K00
代码可运行
举报
文章被收录于专栏:solate 杂货铺solate 杂货铺
运行总次数:0
代码可运行

go yaml 语法学习

go使用比较多的是yaml.v2在github 地址是yaml.v2

git地址是github.com/go-yaml/yaml 但是下载到本地路径是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go get gopkg.in/yaml.v2

kubernetes底层yaml也是这个库,但是自己又封装了 sigs.k8s.io/yaml, 再往上又定义了kustomize

k8s声明式API介绍都需要使用yaml来定义,所以详细了解yaml使用非常有必要

简介

YAML=YAML Ain't Markup Language,YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。多用于api接口的定义。

规则

  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 禁止使用tab缩进,只能使用空格键
  4. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
  5. 使用#表示注释
  6. 字符串可以不用引号标注

yaml 对象

对象

对象:键值对的集合,又称为映射(map)/ 哈希(hashes) / 字典(dictionary)

使用冒号(: )表示键值对,同一缩进的所有键值对属于一个map,示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# YAML表示
age : 12
name : aa
 
# 对应的Json表示
{'age':12,'name':'aa'}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
	"fmt"
	"gopkg.in/yaml.v2"
)

func main() {

	str := `
age : 12
name : aa
`
	type P struct {
		Name string
		Age  int
	}
	var p P
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err) // {aa 12} <nil>
}

数组

数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
使用连字符(-)表示:
# YAML表示
- a
- b
- 12
# 对应Json表示
['a','b',12]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {

	str := `
- a
- b
- 12
`
	var p []string
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err) // [a b 12] <nil>
}

纯量

纯量(scalars):单个的、不可再分的值

数据的嵌套

map嵌套map

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# YAML表示
websites:
 YAML: yaml.org 
 Ruby: ruby-lang.org 
 Python: python.org 
 Perl: use.perl.org 
# 对应Json表示
{ websites: 
   { YAML: 'yaml.org',
     Ruby: 'ruby-lang.org',
     Python: 'python.org',
     Perl: 'use.perl.org' } }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err) 
	// map[websites:map[Perl:use.perl.org Python:python.org Ruby:ruby-lang.org YAML:yaml.org]] <nil>
}

map嵌套list

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# YAML表示
languages:
 - Ruby
 - Perl
 - Python 
 - c
# 对应Json表示
{ languages: [ 'Ruby', 'Perl', 'Python', 'c' ] }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {

	str := `
languages:
 - Ruby
 - Perl
 - Python 
 - c
`

	var p map[string][]string
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err) // map[languages:[Ruby Perl Python c]] <nil>
}

3.list嵌套list

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# YAML表示
-
  - Ruby
  - Perl
  - Python 
- 
  - c
  - c++
  - java
# 对应Json表示
[ [ 'Ruby', 'Perl', 'Python' ], [ 'c', 'c++', 'java' ] ]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {

	str := `
-
  - Ruby
  - Perl
  - Python 
- 
  - c
  - c++
  - java
`

	var p [][]string
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err) // [[Ruby Perl Python] [c c++ java]] <nil>

}

4.list 嵌套map

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# YAML表示
-
  id: 1
  name: huang
-
  id: 2
  name: liao
 
# 对应Json表示
[ { id: 1, name: 'huang' }, { id: 2, name: 'liao' } ]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {

	str := `
-
  id: 1
  name: huang
-
  id: 2
  name: liao
`

	var p []map[string]string
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err) // [map[id:1 name:huang] map[id:2 name:liao]] <nil>
    // 这里一样的情况可以改结构体
}

其他 (这部分易错)

引号

单引号: 会将字符串里面的特殊字符转义为字符串处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name: '123\n123'
输出: 123\n123
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {

	str := `
name: '123\n123'
`

	var p map[string]string
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err) // map[name:123\n123] <nil>

}

双引号: 不会转义字符串里面的特殊字符,特殊字符作为本身想表示的意思。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name: "123\n123" 
输出: 123 换行 123
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {

	str := `
name: "123\n123"
`

	var p map[string]string
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err) 
	// map[name:123
	// 123] <nil>

}

2.文本块

|:使用|标注的文本内容缩进表示的块,可以保留块中已有的回车换行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
value: |
   hello
   world!
输出:hello 换行 world!
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {

	str := `
value: |
   hello
   world!
`

	var p map[string]string
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err)
	// map[value:hello
	// world!
	// ] <nil>

}

+表示保留文字块末尾的换行,-表示删除字符串末尾的换行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
value: |
hello

value: |-
hello

value: |+
hello
输出:hello\n hello hello\n\n(有多少个回车就有多少个\n)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {

	str := `
value: |
   hello
`

	str1 := `
value: |-
   hello
`
	str2 := `
value: |+
   hello

`

	var p map[string]string
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err)
	// map[value:hello
	// ] <nil>

	var p1 map[string]string
	err = yaml.Unmarshal([]byte(str1), &p1)
	fmt.Println(p1, err)
	// map[value:hello] <nil>

	var p2 map[string]string
	err = yaml.Unmarshal([]byte(str2), &p2)
	fmt.Println(p2, err)
	// map[value:hello
	//
	// ] <nil>

}

:使用 > 标注的文本内容缩进表示的块,将块中回车替换为空格,最终连接成一行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
value: > hello
world!
输出:hello 空格 world!
注意 “>” 与 文本之间的空格

例子中必须换行才能正确解析,并且需要缩进YAML Lint

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {

	str := `
value: > 
  hello 
  world!
`
	var p map[string]string
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err)
	// map[value:hello  world!
	// ] <nil>
}

3.锚点与引用

使用 & 定义数据锚点(即要复制的数据),使用 * 引用锚点数据(即数据的复制目的地)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name: &a yaml
book: *a
books: 
   - java
   - *a
   - python
输出book: yaml 
输出books:[java,yaml,python]
注意*引用部分不能追加内容
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {

	str := `
name: &a yaml
book: *a
books: 
   - java
   - *a
   - python
`

	type P struct {
		Name  string
		Book  string
		Books []string
	}
	var p P
	err := yaml.Unmarshal([]byte(str), &p)
	fmt.Println(p, err) // {yaml yaml [java yaml python]} <nil>
}

& 用来建立锚点(defaults),<< 表示合并到当前数据,* 用来引用锚点。 YAML 入门教程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
defaults: &defaults
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  <<: *defaults

test:
  database: myapp_test
  <<: *defaults

相当于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
defaults:
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  adapter:  postgres
  host:     localhost

test:
  database: myapp_test
  adapter:  postgres
  host:     localhost

4.存量,数据类型约定

字符串

使用”或”“或不使用引号

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#YAML
str: abc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#YAML
#包含特殊字符需要加引号
str: '内容:字符串'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#YAML
#单双引号均可,双引号不会对特殊符号转义
s1: '内容\n字符串'
s2: "内容\n字符串"
2.布尔值

true或false表示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#YAML
isTrue: true
isTrue: false
3.数字
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
12 #整数 
014 # 八进制整数 
0xC #十六进制整数 
13.4 #浮点数 
1.2e+34 #指数 
.inf空值 #无穷大
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#YAML
int: 10
float: 1.23
double: 2.34
4.空值

null或~表示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#YAML
person: ~
5.时间

使用 iso-8601 标准表示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#YAML
iso8601: 2018-05-20t10:59:43.10-05:00
6. 日期

日期采用ISO8601的格式yyyy-MM-dd表示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#YAML
date: 2018-05-20
7. 强制类型转换

YAML 允许使用个感叹号!,强制转换数据类型,单叹号通常是自定义类型,双叹号是内置类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
money: !!str
123
date: !Boolean
true
内置类型:
!!int # 整数类型 
!!float # 浮点类型 
!!bool # 布尔类型 
!!str # 字符串类型 
!!binary # 也是字符串类型 
!!timestamp # 日期时间类型 
!!null # 空值 
!!set # 集合 
!!omap,!!pairs # 键值列表或对象列表
!!seq # 序列,也是列表 !!map # 键值表

参考

YAML语法学习

YAML Lint

YAML学习笔记

YAML 入门教程

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说明与转换
最近好多人问我,坐标系转换真的太难了!GCJ02,BD09,火星坐标,大地坐标,啊啊啊,快要疯了!
陈南GISer
2022/04/04
7.1K0
WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说明与转换
高德,百度,Google地图定位偏移以及坐标系转换
一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用;
麦克劳林
2018/09/11
7.5K0
TSINGSEE青犀视频安防监控EasyCVR视频汇聚平台电子地图定位偏移的排查与解决
安防监控EasyCVR视频汇聚综合管理平台具有强大的数据接入、处理及分发能力,平台可提供视频监控直播、云端录像、云存储、录像检索与回看、告警上报与查询、平台级联、云台控制、语音对讲、电子地图、轨迹跟踪、H.265自动转码等视频能力。
TSINGSEE青犀视频
2023/08/03
1910
GIS坐标系:WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说与转换
在我朝,地理坐标转换有:WGS84转GCJ02、GCJ02转BD009、BD09转GCJ02。
周陆军博客
2023/05/14
2.8K0
在EasyCVR中点击电子地图,出现快照不消失情况是什么原因?
EasyCVR视频融合平台基于云边端一体化架构,部署轻快、功能灵活,平台可支持多协议、多类型设备接入,包括:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等(具体见下图)。在视频能力上,可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、智能分析以及平台级联等。
TSINGSEE青犀视频
2023/04/14
3130
视频融合平台EasyCVR电子地图增加鼠标悬停展示经纬度
EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可实现的视频能力有:视频监控直播、云端录像、云存储、录像检索与回看、云台控制、智能告警、平台级联、集群、电子地图、H.265视频自动转码、智能分析等。
TSINGSEE青犀视频
2023/06/25
1920
视频监控管理平台国标GB28181视频EasyCVR电子地图功能展示优化
视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频监控综合管理平台EasyCVR可提供的视频能力包括:视频监控直播、云端录像、云存储、录像检索与回看、告警上报、平台级联、云台控制、语音对讲、电子地图、H.265自动转码等,也具备接入AI智能分析的能力。
TSINGSEE青犀视频
2023/07/26
3570
国标GB28181安防视频LiteCVR平台GIS电子地图模块开发介绍
电子地图应用主要以GIS地理信息系统为核心,在联网监控工程视频监控业务管理中具有重要意义,能发挥GIS系统“一张图”可视化集成展示和空间决策分析方面的优势。
LiteMedia音视频技术
2023/11/14
3040
如何让固定点的监控设备在EasyCVR平台GIS电子地图上显示地理位置?
我们在前期的文章中和大家分享过关于EasyCVR的电子地图功能,该功能可将前端接入的设备(摄像头、车载监控、单兵、执法仪等)在GIS电子地图上实时显示,并且支持点击图标就能观看当前设备的实时视频监控。感兴趣的用户可以翻阅我们往期的文章进行了解。EasyCVR平台的电子地图功能还可支持绘制历史行驶轨迹、历史轨迹回放等。
TSINGSEE青犀视频
2022/08/01
1.3K0
EasyCVR视频融合平台电子地图经纬标识的渲染优化
关于EasyCVR电子地图功能的相关介绍,我们在此前的文章中也分享过不少,感兴趣的用户可以翻阅我们往期的文章进行了解。EasyCVR平台的电子地图功能,可将前端接入的设备(摄像头、车载监控、单兵、执法仪等)在GIS电子地图上实时显示,并且支持点击图标就能观看当前设备的实时视频监控,还可支持绘制历史行驶轨迹、历史轨迹回放等。
TSINGSEE青犀视频
2023/05/05
2890
EasyCVR最新版电子地图数据不显示该如何解决?
EasyCVR视频融合云平台是基于云边端一体化架构,可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理。平台可支持的协议包括:国标GB/T28181、RTMP、RTSP/Onvif协议,以及厂家的私有协议,如:海康Ehome、海康SDK、大华SDK等。在视频功能上,平台可提供监控直播、录像、检索及回看、存储、级联、告警等功能。
TSINGSEE青犀视频
2022/10/10
2740
GCJ02/BD09/WGS84坐标转换脚本分享
从电子地图获取数据后常有坐标系转换的需要,比较常用的是采用未来交通实验室出品的坐标转换程序来完成,但是又要单独把坐标提取出来,又要粘贴在C盘,实在麻烦,所以就自己动手编了一个,坐标转换的代码来自网络,精度不高,调试后是大体能用的。既然重编,想着一步的到位,扩充了多种坐标转换场景,功能异常强大,谁用谁知道,啊哈哈哈哈哈。
Sidchen
2020/08/27
1.9K2
GCJ02/BD09/WGS84坐标转换脚本分享
高德百度坐标系转换方法
在开始这个题目之前,先给大家再次扫扫盲,扫的不是坐标系统的盲,而是我们国家所使用的坐标系统。大家都知道,美国GPS使用的是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置,这应该是国际共识。但在我国,出于国家安全考虑,国内所有导航电子地图必须使用国家测绘局制定的加密坐标系统,即将一个真实的经纬度坐标加密成一个不正确的经纬度坐标,我们在业内将前者称之为地球坐标,后者称之为火星坐标,具体的说明可以参看百度百科中关于火星坐标系统的解释。
哲洛不闹
2018/09/19
7.1K0
为何GPS坐标和百度坐标不一致?
美国GPS使用的 是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置。但在我国,出于国家安全考虑,国内所有导航电子地图必须使用国家测绘局制定的加密 坐标系统,即将一个真实的经纬度坐标加密成一个不正确的经纬度坐标,在业内将前者称之为地球坐标,后者称之为火星坐标。 《条例》要求地图不得“危害国家统一、主权和领土完整;危害国家安全、损害国家荣誉和利益;国家秘密;影响民族团结、侵害民族风俗习惯”,规定互联网地图服务必须经过审批,要求“从事互联网地图服务的,应当将存放地图数据的服务器设在中华人民共和国
苦咖啡
2018/04/28
3.7K0
EasyCVR电子地图轨迹跟踪异步加载百度地图SDK的操作方法
在往期的文章中我们分享过关于EasyCVR电子地图轨迹跟踪的功能开发,感兴趣的用户可以查看这篇文章:智能视频融合EasyCVR平台GIS电子地图:如何实现GPS坐标转换?
TSINGSEE青犀视频
2022/05/19
2540
EasyCVR通过国标GB28181协议接入设备,出现设备自动拉流是什么原因?
EasyCVR在接入协议上,不仅支持国标GB28181协议、RTSP/Onvif、RTMP等标准协议,还支持HIKSDK、大华SDK、海康Ehome等厂家私有协议与SDK,可分发RTSP、RTMP、FLV、HLS、WebRTC等多种格式的视频流。平台可灵活拓展,能实现的视频功能包括:视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联等。近期我们正在对EasyCVR进行新功能的拓展,比如服务器集群、视频轮巡、H.265转码H.264、电子地图与轨迹跟踪等等,欢迎大家关注我们的更新。
TSINGSEE青犀视频
2022/07/01
4610
视频云存储/安防监控/视频汇聚EasyCVR平台新增经纬度选取功能
视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成,我们也提供了丰富的API接口供用户使用。
TSINGSEE青犀视频
2023/08/17
2200
EasyCVR电子地图中设备播放器loading样式的居中对齐优化
我们在此前的文章中介绍过关于EasyCVR平台的GIS电子地图功能,该功能是指,平台可将接入的设备(摄像头、车载监控、单兵、执法仪等)在GIS电子地图上实时显示,并且支持点击图标就能观看当前设备的实时视频监控。此外,平台还可支持绘制历史行驶轨迹、历史轨迹回放等功能,可应用在移动执法、车载监控等场景中。感兴趣的用户可以搜索我们往期的文章进行了解。
TSINGSEE青犀视频
2022/07/05
2760
高质量编码-在线Excel经纬度坐标系转换
GIS大神wandergis在Github上提供了coordtransform 坐标转换工具(Github链接https://github.com/wandergis/coordtransform)
MiaoGIS
2021/07/15
2K0
高质量编码-在线Excel经纬度坐标系转换
gis经纬度坐标转换多格式兼容:支持字符串/数组/GeoJSON
代码,https://www.npmjs.com/package/coordtransform2
周陆军博客
2023/04/09
8710
推荐阅读
相关推荐
WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说明与转换
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 简介
  • 规则
  • yaml 对象
    • 对象
    • 数组
    • 纯量
  • 数据的嵌套
    • map嵌套map
    • map嵌套list
    • 3.list嵌套list
    • 4.list 嵌套map
  • 其他 (这部分易错)
    • 引号
    • 2.文本块
    • 3.锚点与引用
    • 4.存量,数据类型约定
      • 字符串
      • 2.布尔值
      • 3.数字
      • 4.空值
      • 5.时间
      • 6. 日期
      • 7. 强制类型转换
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档