文本编码处理
1、字符串
字符串的基本操作包括包含,连接,取索引,分割等等。
(1)包含判断使用strings.Contains(s, temp),其中s为检测字符串,temp为是否包含的字符串,该函数包含则返回true,反之。
(2)取索引使用strings.Index(s, temp),其中s为检测字符串,temp为待取的字符串,该函数返回的是temp在s中开始的索引位置,没有搜索到返回-1。
(3)分割字符串使用strings.Split(s, temp),其中s为待分割字符串,temp为分割字符,函数返回的是一个以temp为分割,将s分割开的字符串数组。
说到这里有个合并字符串的操作,strings.Join(arrayStr, temp),进行的是和Split完全相反的操作,意会一下。
(4)检测前缀和检测后缀,strings.HasPrefix和strings.HasSuffix,参数包含两个,s和temp,函数返回s的前缀或者后缀是否为temp的bool值。
以上操作如下图中代码所示
2、struct对象的序列化和反序列化
对于struct类型的数据进行xml序列化的时候只有一点需要注意的就是,struct里的变量名都必须大写开头,否则会无法序列化,如下图所示
而反序列化则是使用Unmarshal函数,参数包括已经序列化了的[]byte类型数据以及等待被赋予结果的结构体数据。
3、一个自动化读取vs工程xml类文件的代码实例
package main
import (
"bytes"
"encoding/xml"
"fmt"
"io/ioutil"
)
//获取节点属性值
func getAttrValue(attrs []xml.Attr, name_attr string) string {
var value string
//遍历出入的属性数组,当名称为我们所需要的时候,返回对应的值
for _, v := range attrs {
if v.Name.Local == name_attr {
value = v.Value
}
}
return value
}
func main() {
//读取文件,并解析成一个Decoder
content, err := ioutil.ReadFile("Assembly-CSharp.csproj")
txt_decoder := xml.NewDecoder(bytes.NewBuffer(content))
//待用状态机
var isInItemGroup bool = false
//待用节点
var t xml.Token
//循环整个Decoder
for t, err = txt_decoder.Token(); err == nil; t, err = txt_decoder.Token() {
switch token := t.(type) {
case xml.StartElement: //如果是开始节点
//如果状态机为真说明在ItemGroup中,如果状态机为假且当前节点名称为ItemGroup则修改状态机
if isInItemGroup {
if token.Name.Local == "Compile" {
fmt.Println(getAttrValue(token.Attr, "Include"))
}
} else if token.Name.Local == "ItemGroup" {
isInItemGroup = true
}
case xml.EndElement: //如果是结束节点
//如果状态机为真,且当前结束节点是ItemGroup则修改状态机状态,表示已遍历出ItemGroup标签
if isInItemGroup {
if token.Name.Local == "ItemGroup" {
isInItemGroup = false
}
}
}
}
}
4、命令行解析
待学习!!!
(关于文本编码处理的一点学习笔记,若有误望指正,有新的内容会继续回来编辑)。