golang中的标准库数据格式
数据格式介绍
- 是系统中数据交互不可缺少的内容
- 这里主要介绍JSON、XML、MSGPack
JSON
- json是完全独立于语言的文本格式,是k-v的形式 name:zs
- 应用场景:前后端交互,系统间数据交互
json使用go语言内置的encoding/json 标准库
编码json使用json.Marshal()函数可以对一组数据进行JSON格式的编码
func Marshal(v interface{}) ([]byte, error)
示例过结构体生成json
点击查看代码
type Person struct {
Name string `json:"name"`
Hobby []string `json:"hobby"`
}
func main() {
p := Person{Name: "lisi", Hobby: []string{"pingpang", "LOL"}}
b, err := json.Marshal(&p)
if err != nil {
fmt.Println("Marshal err", err)
}
fmt.Println(string(b))
// 格式化输出
b2, err := json.MarshalIndent(p, "", "\t")
if err != nil {
fmt.Println("Marshal err", err)
}
fmt.Println(string(b2))
}
struct tag
type Person struct {
// "-" 是忽略的意思
Name string `json:"-"`
Hobby []string `json:"hobby"`
}
示例:通过map生成json
func main() {
m1 := make(map[string]interface{})
m1["name"] = "王五"
m1["age"] = 88
b , _ := json.Marshal(&m1)
fmt.Println(string(b))
}
- 解码json使用json.Unmarshal()函数可以对一组数据进行JSON格式的解码
func Unmarshal(data []byte, v interface{}) error
示例解析到结构体:
点击查看代码
type Person struct {
Age int `json:"age,string"`
Name string `json:"name"`
Niubility bool `json:"niubility"`
}
func main() {
b := []byte(`{"age": "18", "name": "王五", "niubibity": true}`)
var p Person
if err := json.Unmarshal(b, &p); err != nil {
fmt.Println(err.Error())
}
fmt.Println(p)
}
- 示例解析到interface
点击查看代码
func main() {
// int和float64都当float64
b := []byte(`{"age": 3.14, "name": "王五", "niubibity": true}`)
var i interface{}
if err := json.Unmarshal(b, &i); err != nil {
fmt.Println(err.Error())
}
// 自动转到map
fmt.Println(i)
// 可以判断类型
m := i.(map[string]interface{})
for k, v := range m {
switch vv := v.(type) {
case float64:
fmt.Println(k, "是float64类型", vv)
case string:
fmt.Println(k, "是string类型", vv)
case bool:
fmt.Println(k, "是bool类型", vv)
default:
fmt.Println("其它类型")
}
}
}
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>
点击查看代码
// 抽取单个server对象
type Server struct {
ServerName string `xml:"serverName"`
ServerIP string `xml:"serverIP"`
}
type Servers struct {
Name xml.Name `xml:"servers"`
Version string `xml:"version"`
Servers []Server `xml:"server"`
}
func main() {
b, err := ioutil.ReadFile("./my.xml")
if err != nil {
fmt.Println(err.Error())
return
}
var s Servers
if err := xml.Unmarshal(b, &s); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("%#v", s)
}
MSGPack
- MSGPack是二进制的json,性能更快,更省空间
- 需要安装第三方包:go get -u github.com/vmihailenco/msgpack
点击查看代码
package main
import (
"encoding/json"
"fmt"
"github.com/vmihailenco/msgpack/v5"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
p := Person{Name: "张三", Age: 35}
b, err := msgpack.Marshal(&p)
b2, _ := json.Marshal(&p)
fmt.Println(len(b)) // 18
fmt.Println(len(b2)) // 26
// 很明显,二进制的json更省空间,性能也更高
if err != nil {
fmt.Println(err.Error())
return
}
var p2 Person
if err := msgpack.Unmarshal(b, &p2); err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(p2)
var m1 interface{}
msgpack.Unmarshal(b, &m1)
fmt.Println(m1)
}
msgpackage写入到文件,从文件读取案例:
点击查看代码
package main
import (
"fmt"
"github.com/vmihailenco/msgpack/v5"
"io/ioutil"
"math/rand"
)
type Person struct {
Name string
Age int
Sex string
}
// 结构体转成json并写入到文件
func writerJson(filename string) (err error) {
var persons []*Person
// 假数据
for i := 0; i < 10; i++ {
p := &Person{
Name: fmt.Sprintf("name%d", i),
Age: rand.Intn(100),
Sex: "male",
}
persons = append(persons, p)
}
// 二进制json序列化
data, err := msgpack.Marshal(persons)
if err != nil {
fmt.Println(err)
return
}
err = ioutil.WriteFile(filename, data, 0666)
if err != nil {
fmt.Println(err)
return
}
return
}
// 从json文件中读取json数据并转成结构体
func readJson(filename string) (err error) {
bData, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Println(err)
return
}
var person []*Person // 注意:此处必须传指针
if err = msgpack.Unmarshal(bData, &person); err != nil {
fmt.Println(err)
return
}
for _, v := range person {
fmt.Printf("%#v\n", *v)
}
return nil
}
func main() {
err := writerJson("./data4.json")
if err != nil {
fmt.Println(err)
return
}
if err := readJson("./data4.json"); err != nil {
fmt.Println(err)
}
}
注意:Marshal将结构体序列化成json的时候,传值或指针都可以,推荐传递指针
Unmarshal将json数据转换成结构体的时候,必须传递指针类型,因为需要通过指针进行赋值
参考网址:msgpack
golang中的标准库数据格式的更多相关文章
- golang中的标准库context
在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...
- golang中的标准库log
Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...
- golang中的标准库context解读
简介 golang 中的创建一个新的 goroutine , 并不会返回像c语言类似的pid,所有我们不能从外部杀死某个goroutine,所有我就得让它自己结束,之前我们用 channel + se ...
- golang中的标准库http
Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. http客户端 基本的HTTP/HTTPS请求 Get.Head.Post和PostForm函数发出HTTP/HTTP ...
- golang中的标准库template
html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用text/templa ...
- golang中的标准库strconv
strconv 包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi().Itia().parse系列.format系列.append系列. string与int ...
- golang中的标准库IO操作
参考链接 输入输出的底层原理 终端其实是一个文件,相关实例如下: os.Stdin:标准输入的文件实例,类型为*File os.Stdout:标准输出的文件实例,类型为*File os.Stderr: ...
- golang中的标准库time
时间类型 time.Time类型表示时间.我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息.示例代码如下: func main() { current := ...
- golang中的标准库反射
反射 反射是指程序在运行期对程序本身访问和修改的能力 变量的内在机制 变量包含类型信息和值信息 var arr [10]int arr[0] = 10 类型信息:是静态的元信息,是预先定义好的 值信息 ...
随机推荐
- JAVA火星坐标系、百度坐标系、84坐标系相互转换工具类
/** * 坐标系转换工具类 */ public class PositionUtil { public static double pi = 3.1415926535897932384626; pu ...
- Windows系统安装Redis服务
下载压缩包,登录 https://github.com/MicrosoftArchive/redis/releases 下载Redis-x64-3.0.504.zip 我也上传了一份 https: ...
- 【LeetCode】563. Binary Tree Tilt 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...
- 【LeetCode】813. Largest Sum of Averages 解题报告(Python)
[LeetCode]813. Largest Sum of Averages 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...
- java 堆、栈
堆: 1)Java的堆是一个运行时数据区,类的对象从堆中分配空间.这些对象通过new等指令建立,通过垃圾回收器来销毁. 2)堆的优势是可以动态地分配内存空间,需要多少内存空间不必事先告诉编译器,因为它 ...
- Chapter 3 Observational Studies
目录 概 3.1 3.2 Exchangeability 3.3 Positivity 3.4 Consistency First Second Fine Point 3.1 Identifiabil ...
- MMD
目录 概 主要内容 定义 MMD for kernel function classes 一个无偏统计量 MMD test Borgwardt K., Gretton A., Rasch M., Kr ...
- CS5265替代LT8711设计TYPEC转HDMI 4K高清投屏方案|LT8711龙迅替代方案
龙迅LT8711是一款Type-C/DP1.2 to HDMI2.0方案芯片.LT8711HE是一款高性能Type-C/DP1.2至HDMI2.0转换器,设计用于将USB typec或DP1.2源连接 ...
- Ranger-AdminServer安装
Ranger-AdminServer安装,对应的Ranger版本1.0.0. RangerAdmin安装依赖如下组件: mysql solr IP/机器名 安装软件 运行进程 zdh-245 Rang ...
- javascript实现base64格式转码与解码
最近碰到一个需求,后端返回base64格式的数据,前端需要进行base64格式解码,好了,前端采用内部提供的atob函数进行解码,开完成,交付测试,然后测试小哥哥小姐姐反馈说中文乱码! 然后查了一下, ...