Go- 数据格式解析
发布于: 2021 年 09 月 08 日
Go 学习笔记,学习内容《Go入门指南》
主要介绍以下内容:
Json 格式解析
Xml 格式解析
Gob 格式解析
代码示例可以直接运行
Json 格式解析
package main
import (
"encoding/json"
"fmt"
"log"
"os"
)
func printDivider(str ...string) {
fmt.Println()
fmt.Println("-----------------------------------------------")
if len(str) > 0 {
fmt.Println(str)
}
}
type Address struct {
Type string
City string
Country string
}
type VCard struct {
FirstName string
LastName string
Addresses []*Address
Remark string
}
func main() {
/*
json包的使用
Go类型与JSON对应如下:
bool booleans
float64 numbers
string strings
nil null
复杂类型、函数类型、Channel不能进行Json编码
指针可以被编码,是对指针的值进行编码
*/
/*
使用Marshal进行编码
*/
printDivider("")
pa := &Address{"private", "Hanzhou", "China"}
wa := &Address{"work", "Shanghai", "China"}
vc := VCard{"Jan", "Wang", []*Address{pa, wa}, "none"}
js, _ := json.Marshal(vc) // 将一个数据结构构造成json字符串
fmt.Printf("JSON format: %s\n", js)
/*
使用Marshal进行编码
*/
file, _ := os.OpenFile("vcard.json", os.O_CREATE|os.O_WRONLY, 0666)
defer file.Close()
enc := json.NewEncoder(file)
err := enc.Encode(vc)
if err != nil {
log.Println("Error in encoding json")
}
/*
使用Unmarshal进行解码
*/
printDivider("使用Unmarshal进行解码")
b := []byte(`{"Name": "Wednesday", "Age": 6, "Parents": ["Gomez", "Morticia"]}`)
var f interface{}
err = json.Unmarshal(b, &f)
m := f.(map[string]interface{})
for k, v := range m {
fmt.Println(k, v)
}
fmt.Println("********************************")
for k, v := range m {
switch vv := v.(type) {
case string:
fmt.Println(k, " = ", v)
case float64:
fmt.Println(k, " = ", v)
case []interface{}:
fmt.Println(k, " = ")
for i, u := range vv {
fmt.Println(i, u)
}
default:
fmt.Println(k, " is a x type")
}
}
}
复制代码
Xml 格式解析
package main
import (
"encoding/xml"
"fmt"
"strings"
)
var t, token xml.Token
var err error
func main() {
input := "<Person><FirstName>Laura</FirstName><LastName>Lynn</LastName></Person>"
inputReader := strings.NewReader(input)
p := xml.NewDecoder(inputReader)
for t, err = p.Token(); err == nil; t, err = p.Token() {
switch token := t.(type) {
case xml.StartElement:
name := token.Name.Local
fmt.Printf("Token name: %s\n", name)
for _, attr := range token.Attr {
attrName := attr.Name.Local
attrValue := attr.Value
fmt.Printf("An attribute is: %s %s\n", attrName, attrValue)
}
case xml.EndElement:
fmt.Println("End of token")
case xml.CharData:
content := string([]byte(token))
fmt.Printf("This is the content : %v\n", content)
}
}
}
复制代码
Gob 格式解析
package main
import (
"bytes"
"encoding/gob"
"fmt"
"log"
)
type P struct {
X, Y, Z int
Name string
}
type Q struct {
X, Y *int32
Name string
}
func main() {
var network bytes.Buffer
enc := gob.NewEncoder(&network)
dec := gob.NewDecoder(&network)
err := enc.Encode(P{3, 4, 5, "It'me"})
if err != nil {
log.Fatal("encode error: ", err)
}
var q Q
err = dec.Decode(&q)
if err != nil {
log.Fatal("Decode error: ", err)
}
fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y)
}
复制代码
划线
评论
复制
发布于: 2021 年 09 月 08 日阅读数: 4
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/a3cdd9ca95f94129bf207539d】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
HelloBug
关注
还未添加个人签名 2018.09.20 加入
还未添加个人简介
评论