GO语言基础教程(226)Go二进制文件的写入、读取操作之自定义二进制格式:Go语言二进制操作秘笈:自定义格式的魔法之旅

在编程世界里,有时我们需要将数据紧凑地存储起来,或者高效地在网络间传输,这时二进制格式就成了我们的不二之选。今天,就让我们一起探索Go语言中二进制文件操作的奥秘!

第一部分:二进制文件基础 - 为什么不用文本格式?

在我们深入技术细节之前,先来理解一个基本问题:为什么有时候我们要选择二进制格式而不是简单的文本格式?

想象一下,如果你需要存储一个简单的整数12345。在文本格式中,它会存储为字符"1"、"2"、"3"、"4"、"5",占用5个字节。而在二进制格式中,同样的整数只需要4个字节(int32)。当数据量庞大时,这种差异会非常显著!

二进制格式的优势

  • 更紧凑:占用空间更少
  • 读写更快:无需复杂的解析过程
  • 类型保持:保持数据的原始类型信息

但要注意,二进制格式也有缺点,比如可读性差——用普通文本编辑器打开二进制文件,你看到的只是一堆乱码。这就是为什么我们需要专门学习如何读写它们!

第二部分:Go语言中的二进制格式入门

Go语言提供了多种处理二进制数据的方式,主要分为两类:

  1. 使用标准库的encoding/gob
  2. 自定义二进制格式使用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)
    }
}

运行这段代码,你会看到输出:"解码成功

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值