Golang——数据格式

发布于:2024-05-20 ⋅ 阅读:(135) ⋅ 点赞:(0)

        一. 介绍

  • 是系统中数据交互不可缺少的部分
  • 这里主要介绍JSON,XML,MSGPack

        二. JSON

  • json是完全独立于语言的文本格式,是k-v的形式。name:wy
  • 应用场景:前后端交互,系统间数据交互

  •  json使用go语言内置的encoding/json标准库
  • 编码json使用json.Marshal()函数可以对一组数据进行JSON格式编码
func Marshal(v interface{}) ([]byte, error)

        示例:结构体生成json

  • struct tag(标签) 

  • 通过map生成json示例

  • 解码json使用json.Unmarshal()函数可以对一组数据进行JSON格式的编码
func Unmarshal(data []byte, v interface{}) error

  •  示例,解析到interface{}

         三.XML

  • 是可扩展标记语言,包含声明,根标签,子元素和属性
  • 应用场景:配置文件以及webService

示例:

<?xml version="1.0" encoding="UTF-8"?>
<servers version="1">
	<server>
		<serverName>Shanghai_VPN</serverName>
		<serverIP>127.0.0.1</serverIP>
	</server>
	<server>
		<serverName>Beijing_VPN</serverName>
		<serverIP>127.0.0.2</serverIP>
	</server>
</servers>

        四. MSGPack

  • MSGPack是二进制的json,性能更快,更省空间

  • 需要安装第三方包:go get -u github.com/vmihailenco/msgpack

 示例:

package main

import (
	"fmt"
	"io/ioutil"
	"math/rand"

	"github.com/vmihailenco/msgpack"
)

type Person struct {
	Name string
	Age  int
	Sex  string
}

func writeFunc(filename string) error {
	//假数据
	var persons []*Person
	for i := 0; i < 10; i++ {
		person := &Person{
			Name: fmt.Sprintf("%d", i),
			Age:  rand.Intn(100),
			Sex:  "male",
		}
		persons = append(persons, person)
	}

	//二进制json序列化
	data, err := msgpack.Marshal(persons)
	if err != nil {
		fmt.Println("mspack marshal fail ", err)
		return err
	}
	//fmt.Println(string(data))

	err = ioutil.WriteFile(filename, data, 0666)
	if err != nil {
		fmt.Printf("write file %v fail err : %v\n", filename, err)
		return err
	}
	return nil
}

func readFunc(filename string) (err error) {
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		fmt.Println(err)
		return
	}
	//fmt.Println(string(data))

	var persons []*Person
	err = msgpack.Unmarshal(data, &persons) //反序列化
	if err != nil {
		fmt.Println(err)
		return err
	}

	for _, v := range persons {
		fmt.Printf("%#v\n", v)
	}

	return
}

func main() {
	err := writeFunc("./person.bat")
	if err != nil {
		return
	}

	err = readFunc("./person.bat")
	if err != nil {
		return
	}
}


网站公告

今日签到

点亮在社区的每一天
去签到