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 类型信息:是静态的元信息,是预先定义好的 值信息 ...
随机推荐
- 【九度OJ】题目1434:今年暑假不AC 解题报告
[九度OJ]题目1434:今年暑假不AC 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1434 题目描述: "今年暑假不A ...
- LeetCode解题报告汇总! All in One!
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 把自己刷过的所有题目做一个整理,并且用简洁的语言概括了一下思路,汇总成了一个表格. 题目 ...
- 【LeetCode】28. Implement strStr() 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 find函数 遍历+切片 日期 题目地址:https ...
- 【LeetCode】449. Serialize and Deserialize BST 解题报告(Python)
[LeetCode]449. Serialize and Deserialize BST 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/pro ...
- 【LeetCode】819. Most Common Word 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 正则+统计 日期 题目地址:https://leet ...
- a.equals(b) 判断对象相等
一.值是null的情况: 1.a.equals(b), a 是null, 抛出NullPointException异常. 2.a.equals(b), a不是null, b是null, 返回fals ...
- 使用.NET 6开发TodoList应用(11)——使用FluentValidation和MediatR实现接口请求验证
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在响应请求处理的过程中,我们经常需要对请求参数的合法性进行校验,如果参数不合法,将不继续进行业务逻辑的处理.我们当然可以将每个 ...
- Going Deeper with Convolutions (GoogLeNet)
目录 代码 Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[C]. computer vision and pattern ...
- zbar解析二维码demo
开发环境;ubuntu 18.04 IDE:clion 2019 源文件.cpp #include <opencv2/opencv.hpp> #include <zbar.h> ...
- CS5210完全替代AG6202|HDMI转VGA芯片+原理图|替代兼容AG6202
安格AG6202是一个HDMI转VGA不带音频解决方案,用于实现HDMI1.4高分辨率视频转VGA转换器.Capstone CS5210不管在性能上和设计参数上面都是可以完全替代安格AG6202,且 ...