在编程世界里,有时我们需要将数据紧凑地存储起来,或者高效地在网络间传输,这时二进制格式就成了我们的不二之选。今天,就让我们一起探索Go语言中二进制文件操作的奥秘!
第一部分:二进制文件基础 - 为什么不用文本格式?
在我们深入技术细节之前,先来理解一个基本问题:为什么有时候我们要选择二进制格式而不是简单的文本格式?
想象一下,如果你需要存储一个简单的整数12345。在文本格式中,它会存储为字符"1"、"2"、"3"、"4"、"5",占用5个字节。而在二进制格式中,同样的整数只需要4个字节(int32)。当数据量庞大时,这种差异会非常显著!
二进制格式的优势:
- 更紧凑:占用空间更少
- 读写更快:无需复杂的解析过程
- 类型保持:保持数据的原始类型信息
但要注意,二进制格式也有缺点,比如可读性差——用普通文本编辑器打开二进制文件,你看到的只是一堆乱码。这就是为什么我们需要专门学习如何读写它们!
第二部分:Go语言中的二进制格式入门
Go语言提供了多种处理二进制数据的方式,主要分为两类:
- 使用标准库的
encoding/gob包 - 自定义二进制格式使用
encoding/binary包
2.1 使用Gob包 - Go语言的"专属快递员"
encoding/gob是Go语言的一个特色包,它能够自动编码和解码Go语言中的数据类型。就像是一个专业的快递员,他知道如何将你的数据结构完好无损地打包、运送和拆包。
让我们看一个简单的例子,演示如何使用gob包将数据编码为二进制格式:
package main
import (
"encoding/gob"
"fmt"
"os"
)
func main() {
info := "http://jb51.net/golang/"
file, err := os.Create("./output.gob")
if err != nil {
fmt.Println("文件创建失败", err.Error())
return
}
defer file.Close()
encoder := gob.NewEncoder(file)
err = encoder.Encode(info)
if err != nil {
fmt.Println("编码错误", err.Error())
return
} else {
fmt.Println("编码成功")
}
}
这段代码创建了一个名为output.gob的二进制文件,并将字符串写入其中。生成的文件内容会是这样的二进制序列:
210c 001e 6874 7470 3a2f 2f63 2e62 6961
6e63 6865 6e67 2e6e 6574 2f67 6f6c 616e
672f
那么,如何读取这个二进制文件呢?同样简单:
package main
import (
"encoding/gob"
"fmt"
"os"
)
func main() {
file, err := os.Open("./output.gob")
if err != nil {
fmt.Println("文件打开失败", err.Error())
return
}
defer file.Close()
decoder := gob.NewDecoder(file)
info := ""
err = decoder.Decode(&info)
if err != nil {
fmt.Println("解码失败", err.Error())
} else {
fmt.Println("解码成功")
fmt.Println(info)
}
}
运行这段代码,你会看到输出:"解码成功

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



