1、xml标签常见用法
xml:"xxx,omitempty" 代表如果这个字段为空,则序列化时忽略该字段
xml:"xxx,attr" 代表字段为xml标签的属性说明
xml:"-" 代表序列化时忽略该字段
xml:"a>b>c" 代表xml标签嵌套模式
2、golang ioutil.WriteFile函数perm参数的用法
ioutil.WriteFile(filename string, data []byte, perm os.FileMode)
ioutil.WriteFile在创建新文件时,并不是直接使用参数perm的值,而是要和umask的值做合并的。把函数参数的值合并到当前umask的值,才是最终创建出来文件的perm属性。
umask的含义
某位是1时,则把这位的perm属性关闭(disable)
某位是0时,则把这位的perm属性打开(enable)
owner group other
0 - rwx - rwx - rwx
(从左往右读)
第1位:文件的属性,一般常用的是"-",表示普通文件,"d"表示是一个目录
第2-4位:文件的所有者的权限rwx(可读/可写/可执行)
第5-7位:文件所属用户组的权限rwx(可读/可写/可执行)
第8-10位:其他人的权限rwx(可读/可写/可执行)
例如:
$ umask 0222 # 对owner, group,和other的写属性都关闭。
$ umask 0124 # 对owner关闭读属性,对group关闭写属性,对other关闭读和写属性
3、写操作
package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
)
func checkError(err error){
if err != nil{
panic(err)
}
}
type Student struct{
Name string `xml:"name"`
Address string `xml:"addr"`
Father string `xml:"parent>father"` // 表示parent目录下
Mother string `xml:"parent>mother"`
Note string `xml:"note,attr"` // 属性
}
func main(){
stu := &Student{
Name:"George",
Address: "北京",
Father: "梨花",
Mother: "桂花",
Note: "first",
}
data,err := xml.MarshalIndent(stu,""," ") // 第二个表示每行的前缀,这里不用,第三个是缩进符号,这里用tab
checkError(err)
fmt.Println(data)
src := "a.xml"
err = ioutil.WriteFile(src,data,0777)
checkError(err)
}
4、读操作
func readFromXml(src string){
content,err := ioutil.ReadFile(src)
checkError(err)
newStu := &Student{}
err = xml.Unmarshal(content,&newStu)
fmt.Println(newStu)
}
5、再记录一个人的语文数学成绩
package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
"strconv"
)
func checkError(err error){
if err != nil{
panic(err)
}
}
type Study struct{
CourseName string `xml:"CourseName"`
Score int `xml:"Score"`
}
type Student struct{
Name string `xml:"name"`
Address string `xml:"addr"`
ScoreList []Study `xml:"ScoreList"`
Num int `xml:"Num,attr"`
}
func writeToXml(src string){
stu := &Student{
Name: "George",
Address: "北京",
ScoreList: []Study{{"语文",21},{"数学",22}},
}
stu.Num = len(stu.ScoreList)
data,err := xml.MarshalIndent(stu,""," ") // 第二个表示每行的前缀,这里不用,第三个是缩进符号,这里用tab
checkError(err)
err = ioutil.WriteFile(src,data,0777)
checkError(err)
}
func readFromXml(src string){
content,err := ioutil.ReadFile(src)
checkError(err)
newStu := &Student{}
err = xml.Unmarshal(content,&newStu)
checkError(err)
ScoreList := newStu.ScoreList
fmt.Println(newStu.Name+"的学习情况")
for _,v := range ScoreList{
fmt.Println("Course:"+v.CourseName+"\tScore:"+strconv.Itoa(v.Score))
}
}
func main(){
src := "a.xml"
writeToXml(src)
readFromXml(src)
}