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.Tokenvar 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 加入
还未添加个人简介











评论