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











    
评论