go语言yaml字符串 go读取yaml

Go中字符串的遍历首先说一下go中的字符串类型:
字符串就是一串固定长度的字符连接起来的字符序列 。Go的字符串是由单个字节连接起来的 。Go语言的字符串的字节使用UTF-8编码标识Unicode文本 。
下面介绍字符串的三种遍历方式,根据实际情况选择即可 。
该遍历方式==缺点==:遍历是按照字节遍历,因此如果有中文等非英文字符,就会出现乱码,比如要遍历"abc北京"这个字符串,效果如下:
可见这不是我们想要的效果,根据utf-8中文编码规则,我们要str[3]str[4]str[5]三个字节合起来组成“北”字及 str[6]str[7]str[8]合起来组成“京”字 。由此引出下面第二种遍历方法 。
该方式是按照字符遍历的,所以不会出现乱码,如下:
运行结果:
从图中可以看到第二个汉子“京”的开始下标是6 , 直接跳过了4和5 , 可见确实依照utf8编码方式将三个字节组合成了一个汉字,str[3]-str[5]组合成“北”字,str[6]-str[8]组合成了“京”字 。
由于下标的不确定性 , 所以引出了下面的遍历方式 。
1 可以先将字符串转成 []rune 切片
2 再用常规方法进行遍历
运行效果:
由此可见下标是按1递增的 , 没有产生跳跃现象 。
Go中标签的用途是什么?字段标签允许您将元信息附加到可以使用反射获取的字段上 。通常,它用于提供有关如何将结构域编码为另一种格式(或从另一种格式存储(或从数据库中检索))的转换信息,但是您可以使用它存储想要存储的任何元信息 , 这些元信息既可以用于另一种包装或供您自己使用 。
如的文档所述reflect.StructTag,按照惯例,标记字符串的值是用空格分隔的key:"value"成对列表 , 如:
type User struct {
Name string `json:"name" xml:"name"`
}
的key通常表示包,随后的"value"是 , 如json密钥被处理/使用的encoding/json包 。
如果要在中传递多个信息"value",通常通过用逗号(',')隔开来指定它,如
Name string `json:"name,omitempty" xml:"name"`
通常用破折号('-')"value"表示将字段从过程中排除(如,在这种情况下,json表示不封送或取消封送该字段) 。
使用反射访问自定义标签的示例
我们可以使用反射(reflect包)来访问结构字段的标记值 。基本上,我们需要获取Type结构的 , 然后可以使用Type.Field(i
int)或查询字段Type.FieldByName(name
【go语言yaml字符串 go读取yaml】string) 。这些方法返回的值StructField描述/表示一个struct字段;并且StructField.Tag是StructTag描述/表示标记值的类型值 。
以前我们谈论过 “惯例”。该公约的手段,如果你遵循它,你可以使用StructTag.Get(key
string)它解析变量的值 , 并返回该方法"value"的key指定 。该公约实施/内置到这个Get()方法 。如果不遵守约定 , Get()将无法解析key:"value"对并找到您要查找的内容 。这也不是问题,但是随后您需要实现自己的解析逻辑 。
还有StructTag.Lookup()(在Go1.7中添加了),它 “类似于 , Get()但是将不包含给定键的标签与将空字符串与给定键相关联的标签区分开” 。因此,看一个简单的示例:
type User struct {
Namestring `mytag:"MyName"`
Email string `mytag:"MyEmail"`}
u := User{"Bob", "bob@mycompany.com"}
t := reflect.TypeOf(u)for _, fieldName := range []string{"Name", "Email"} {
field, found := t.FieldByName(fieldName)if !found {continue
}
fmt.Printf("\nField: User.%s\n", fieldName)
fmt.Printf("\tWhole tag value : %q\n", field.Tag)
fmt.Printf("\tValue of 'mytag': %q\n", field.Tag.Get("mytag"))

推荐阅读