脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go语言中序列化与反序列化示例详解

Go语言中序列化与反序列化示例详解

2022-07-21 15:54前端若水 Golang

我们的数据对象要在网络中传输或保存到文件,就需要对其编码和解码动作,Go语言当然也支持所有这些编码格式,下面这篇文章主要给大家介绍了关于Go语言中序列化与反序列化的相关资料,需要的朋友可以参考下

前言

Go语言的序列化与反序列化在工作中十分常用,在Go语言中提供了相关的解析方法去解析JSON,操作也比较简单

序列化

?
1
2
3
4
5
6
// 数据序列化
func Serialize(v interface{})([]byte, error)
 
// fix参数用于添加前缀
//idt参数用于指定你想要缩进的方式
func serialization (v interface{}, fix, idt string) ([]byte, error)

array、slice、map、struct对象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//struct
import (
    "encoding/json"
    "fmt"
)
 
type Student struct {
    Id   int64
    Name string
    Desc string
}
 
 func fn() {
    std := &Student{0, "Ruoshui", "this to Go"}
    data, err := json.MarshalIndent(std, "", "   "
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(data))
}
//array、slice、map
func fc() {
    s := []string{"Go", "java", "php"}
    d, _ := json.MarshalIndent(s, "", "\t")
    fmt.Println(string(d))
    
    m := map[string]string{
        "id": "0",
        "name":"ruoshui",
        "des": "this to Go",
    }
    bytes, _ := json.Marshal(m)
    fmt.Println(string(bytes))
}

序列化的接口

在json.Marshal中,我们会先去检测传进来对象是否为内置类型,是则编码,不是则会先检查当前对象是否已经实现了Marshaler接口,实现则执行MarshalJSON方法得到自定义序列化后的数据,没有则继续检查是否实现了TextMarshaler接口,实现的话则执行MarshalText方法对数据进行序列化

MarshalJSON与MarshalText方法虽然返回的都是字符串,不过MarshalJSON方法返回的带引号,MarshalText方法返回的不带引号

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//返回带引号字符串
type Marshaler interface {
    MarshalJSON() ([]byte, error)
}
type Unmarshaler interface {
    UnmarshalJSON([]byte) error
}
 
//返回不带引号的字符串
type TextMarshaler interface {
    MarshalText() (text []byte, err error)
}
type TextUnmarshaler interface {
    UnmarshalText(text []byte) error
}

反序列化

?
1
func Unmarshal(data [] byte, arbitrarily interface{}) error

该函数会把传入的数据作为json解析,然后把解析完的数据存在arbitrarily中,arbitrarily是任意类型的参数,我们在用此函数进行解析时,并不知道传入参数类型所以它可以接收所有类型且它一定是一个类型的指针

slice、map、struct反序列化

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//struct
type Student struct {
    Id int64    `json:"id,string"`
    Name string `json:"name,omitempty"`
    Desc string `json:"desc"`
}
 
func fn() {
    str := `{"id":"0", "name":"ruoshui", "desc":"new Std"}`
    var st Student
    _ = json.Unmarshal([]byte(str), &st)
    fmt.Println(st)
}
//slice和map
func f() {
    slice := `["java", "php", "go"]`
    var sli []string
    _ = json.Unmarshal([]byte(slice), &sli)
    fmt.Println(sli)
 
 
    mapStr := `{"a":"java", "b":"node", "c":"php"}`
    var newMap map[string]string
    _ = json.Unmarshal([]byte(mapStr), &newMap)
    fmt.Println(newMap)
}

总结

到此这篇关于Go语言中序列化与反序列化的文章就介绍到这了,更多相关Go序列化与反序列化内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7122270032448454664

延伸 · 阅读

精彩推荐
  • GolangGolang 实现超大文件读取的两种方法

    Golang 实现超大文件读取的两种方法

    这篇文章主要介绍了Golang 实现超大文件读取的两种方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    wuhaung18032021-06-03
  • Golanggolang并发下载多个文件的方法

    golang并发下载多个文件的方法

    今天小编就为大家分享一篇golang并发下载多个文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    moxiaomomo7922020-05-26
  • GolangGo语言基础go build命令用法及示例详解

    Go语言基础go build命令用法及示例详解

    这篇文章主要为大家介绍了Go语言基础go build命令用法及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    枫少文13552021-12-08
  • GolangGolang通脉之map详情

    Golang通脉之map详情

    这篇文章主要介绍了Golang通脉之map,Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现,map 是一种无序的键值对的集合。map 最重要的一点...

    10682021-11-24
  • GolangGolang import 导入包语法及一些特殊用法详解

    Golang import 导入包语法及一些特殊用法详解

    这篇文章主要介绍了Golang import 导入包语法及一些特殊用法,需要的朋友可以参考下 ...

    吕海洋4162020-06-05
  • GolangGo语言Echo服务器的方法

    Go语言Echo服务器的方法

    这篇文章主要介绍了Go语言Echo服务器的方法,实例分析了Echo服务器的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    Go语言编程实例3882020-04-18
  • GolangGolang学习笔记之安装Go1.15版本(win/linux/macos/docker安装)

    Golang学习笔记之安装Go1.15版本(win/linux/macos/docker安装)

    这篇文章主要介绍了Golang学习笔记之安装Go1.15版本(win/linux/macos/docker安装),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要...

    NBody编程那些事6772021-02-21
  • GolangGo语言的http/2服务器功能及客户端使用

    Go语言的http/2服务器功能及客户端使用

    Golang 有一个很棒的自带 http 服务器软件包,不用说就是: net/http, 它非常简单,但是功能非常强大。下面这篇文章主要给大家介绍了关于Go语言的http/2服务...

    daisy4562020-05-19