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();

 

posted @ 2021-10-14 20:32  道霖  阅读(462)  评论(0编辑  收藏  举报