Go 对象序列化

本文介绍了Go语言中如何进行对象的序列化和反序列化,特别是针对JSON格式的操作。序列化是将内存中的对象状态转换为可存储或传输的形式,而反序列化则是相反过程。Go标准库提供了`json.Marshal`和`json.Unmarshal`方法,用于对象到JSON字符串的转化和JSON数据到Go对象的解析。这两个方法在不同编程语言间传递对象、存储或在网络上传输数据时非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在程序运行的过程中,所有的变量都是在内存中。可以随时修改变量,但是一旦程序结束,变量所占用的内存就会被操作系统全部回收。如果你想在程序退出后,仍然可以访问数据,就需要使用序列化,将对象的当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
把变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入到磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化

序列化的目的

  1. 以某种存储形式使自定义对象持久化
  2. 将对象从一个地方传递到另一个地方
  3. 使程序更具维护性

序列化为json格式

如果要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但通常使用JSON格式。因为JSON表示出来就是一个字符串,可以被所有语言读取,且读取速度比XML更快,非常方便。
Go内置的标准包encoding/json下面有Go对象到Json格式的转化,官方有关介绍可以戳https://golang.org/doc/articles/json_and_go.html

json.Marshal
func Marshal(v interface{}) ([]byte, error) {
    //...
}

Marshal方法会将Go对象序列化为JSON字符串,而在Go语言底层,一个字符串值即一个包含了若干个字节的序列。字节序列在Go中用[]byte类型表示,即一个由8位二进制数表示的无符号整数的切片([]uint8)。

示例
package main

import (
    "fmt"
    "encoding/json"
)

type Info struct {
    Name string
    Age  int
    Sex  string
}

func main() {
    infos := []Info{
        {
			Name: "Sophia",
			Age:  23,
			Sex:  "female",
		},
		{
			Name: "Benjie",
			Age:  24,
			Sex:  "male",
		},
    }
    data, err := json.Marshal(infos)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(data)
    fmt.Println(string(data))

    /*
    [91 123 34 78 97 109 101 34 58 34 83 111 112 104 105 97 34 44 34 65 103 101 34 58 50 51 44 34 83 101 120 34 58 34 102 101 109 9
7 108 101 34 125 44 123 34 78 97 109 101 34 58 34 66 101 110 106 105 101 34 44 34 65 103 101 34 58 50 52 44 34 83 101 120 34 58
 34 109 97 108 101 34 125 93] 
    [{"Name":"Sophia","Age":23,"Sex":"female"},{"Name":"Benjie","Age":24,"Sex":"male"}]
    */
}

反序列化json数据为Go对象

json.Unmarshal
func Unmarshal(data []byte, v interface{}) error {
    //...
}

Unmarshal函数会解析JSON编码的数据,然后将结果保存到v中。如果传入的参数v的值为nil,或者类型不是指针,那么函数会返回一个错误。
如果解析的内容字面上为空,那么Unmarshal会将结果指向nil。否则,会将结果反序列化到v指向的对象中。为了将JSON反序列化到Go结构体,Unmarshal会将Json对象中的key和结构体中的key(也可以是结构体标签)进行匹配,而且对大小写不敏感。

示例
package main

import (
	"fmt"
	"encoding/json"
)

type Info struct {
	Name string
	Age  int
	Sex  string
}

func main() {
	var str = []byte(`[
                {"name":"Sophia","age":23,"sex":"female"},
                {"name":"Benjie","age":32,"sex":"male"}
                    ]`)
	var info []Info
	if err := json.Unmarshal(str, &info); err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println(info)
    //打印结果:[{Sophia 23 female} {Benjie 32 male}]
}

参考文章

  1. 序列化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值