注意
本文最后更新于 2024-06-19,文中内容可能已过时。
介绍
Go的gob是Go语言标准库中的一种序列化/反序列化格式,主要用于在编码和解码时传输和存储Go数据结构。Gob格式专为Go语言设计,提供了一种高效的二进制编码方式,特别适合在网络通信和文件存储中使用。
以下是Go的gob包的一些关键特性和使用方法:
特性
高效的二进制编码:Gob格式比JSON和XML等文本格式更为紧凑和高效,因为它使用二进制表示数据。
面向Go语言:Gob格式支持Go语言中的复杂数据结构,包括嵌套结构、切片、映射等。
自动化的编码和解码:使用gob包可以自动处理编码和解码过程,无需手动序列化和反序列化。
例子
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
package main
import (
"bytes"
"encoding/gob"
"fmt"
"log"
"os"
)
type Person struct {
Name string
Age int
}
func main() {
// 创建一个Person实例
person := Person{Name: "Alice", Age: 30}
// 创建一个缓冲区来存储编码后的数据
var buf bytes.Buffer
// 创建一个新的编码器并对缓冲区进行编码
encoder := gob.NewEncoder(&buf)
err := encoder.Encode(person)
if err != nil {
fmt.Println("编码错误:", err)
}
// 打印编码后的数据
fmt.Println("编码后的数据:", buf.Bytes())
// 把编码后的数据写入文件中
file, err := os.OpenFile("data.gob", os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0666)
if err != nil {
log.Fatal("打开文件错误:", err)
}
defer file.Close() // 确保文件在程序结束时关闭
encoder2 := gob.NewEncoder(file)
err = encoder2.Encode(person)
if err != nil {
log.Fatal("编码错误:", err)
}
// 解码
file2, err := os.Open("data.gob")
if err != nil {
log.Fatal("打开文件错误:", err)
}
defer file2.Close() // 确保文件在程序结束时关闭
decoder2 := gob.NewDecoder(file2)
var person2 Person
err = decoder2.Decode(&person2)
if err != nil {
log.Fatal("解码错误:", err)
}
// 打印解码后的数据
fmt.Println("解码后的数据:", person2)
// 将解码后的数据写入 "test.txt" 文件
file3, err := os.OpenFile("test.txt", os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0666)
if err != nil {
log.Fatal("打开文件错误:", err)
}
defer file3.Close() // 确保文件在程序结束时关闭
_, err = fmt.Fprintf(file3, "Name: %s, Age: %d\n", person2.Name, person2.Age)
if err != nil {
log.Fatal("写入文件错误:", err)
}
}
|
代码解释
创建和编码Person实例:创建 Person 实例并编码成字节缓冲区。
打印编码后的数据:打印编码后的数据字节切片(注意:这是二进制数据,不是人类可读的格式)。
将编码数据写入文件:将编码后的数据写入 “data.gob” 文件。
解码数据:从 “data.gob” 文件中读取数据并解码回 Person 实例。
打印解码后的数据:打印解码后的 Person 实例数据。
写入解码数据到test.txt:将解码后的 Person 实例数据写入 “test.txt” 文件,以人类可读的格式输出。