go编码和解码
一、JSON的编码和解码
数据结构要在网络中传输或保存到文件,就必须对其编码和解码。
这里的数据结构指的是go语言中的相关数据结构,比如结构体、切片等。
编码格式:JSON,XML,gob,Google缓冲协议等。
结构可能包含二进制数据,如果将其作为文本打印,那么可读性是很差的。
另外结构内部可能包含匿名字段,而不清楚数据的用意。
序列化是在内存中把数据转换成指定格式(data -> string),反之亦然(string -> data structure)
编码:数据结构--->数据流
解码:数据流--->数据结构
JSON format: {"FirstName":"Jan","LastName":"Kersschot","Addresses":[{"Type":"private","City":"Aartselaar","Country":"Belgium"},{"Type":"work","City":"Boom","Country":"Belgium"}],"Remark":"none"}
这是写入文件。
如果是应用在web中,则使用json.MarshalforHTML(),它会安全的编码。
不是所有的数据都可以编码为 JSON 类型,只有验证通过的数据结构才能被编码:
(1) JSON 对象只支持字符串类型的 key
(2) 要编码一个Go map类型,map必须是map[string]T(T是json 包中支持的任何类型)
(3) Channel,复杂类型和函数类型不能被编码
(4) 不支持循环数据结构;它将引起序列化进入一个无限循环
(5) 指针可以被编码,实际上是对指针指向的值进行编码(或者指针是 nil)
反序列化
UnMarshal()把JSON解码为数据结构
解码后的结构为:
这是一个map,格式为map[string]interface{}
通过这种方式,可以处理未知的JSON数据,同时确保类型安全。
如果我们事先知道JSON数据,我们可以定义一个结构体,用于接收解码后的数据。
要想把 JSON 直接写入文件,可以使用 json.NewEncoder 初始化文件(或者任何实现 io.Writer 的类型),并调用 Encode()
要想从 文件 直接读取JSON,可以使用 json.NewDecoder 初始化文件(或者任何实现 io.Reader 的类型),并调用 Decode()
二、XML的编码和解码
input := "<Person name=\"1\" age=\"10\"><FirstName>Laura</FirstName><LastName>Lynn</LastName></Person>"
<Person name=\"1\" age=\"10\">是一个token
<FirstName>是一个token
Laura是一个token
</FirstName>是一个token
<LastName>是一个token
Lynn是一个token
</LastName>是一个token
</Person>是一个token
xml中的每一个位置,都是一个独立的token。
三、用Gob传输数据
Go binary
类似于python的pickle
Gob 通常用于远程方法调用(RPCs)参数和结果的传输,以及应用程序和机器之间的数据传输。
Gob 特定地用于纯 Go 的环境中,例如,两个用 Go 写的服务之间的通信。而JSON和XML是通用于所有编程语言的。
只有可导出的字段会被编码,零值会被忽略。在解码结构体的时候,只有同时匹配名称和可兼容类型的字段才会被解码。
1、字段必须是大写,才可以从发送端发送到接收端。
2、发送端的字段值如果是0,则会被忽略,也就是不会传递过去。
用u来接收发送端的t
接收之后,u.X = 7,u.Y = 0
注意,u.Y的零是它自己的,不是从发送端传来的。因为发送端的t.Y是0,因此不会发送给接收者。
Gob的使用方式同JSON一样
编码时:NewEncoder()创建Encoder对象,Encoder对象调用Encode();
解码时:NewDecoder()创建DeCoder对象,Decoder对象调用Decode();