Golang读写二进制文件方法总结

 更新时间:2023年05月10日 16:00:24   作者:路多辛  
使用 Golang 的 encoding/gob 包读写二进制文件非常方便,而且代码量也非常少,本文就来通过两个示例带大家了解一下encoding/gob的具体用法吧

使用 Golang 的 encoding/gob 包读写二进制文件非常方便,而且代码量也非常少。但是在需要自定义二进制格式(自定义二进制格式有可能做到更紧凑的数据表示和更快的读写速度)的场景下,这个包就不适用了,这时候就需要使用到 encoding/binary 包了。

encoding/binary 包实现了数字(number)和字节序列(byte sequences)之间的简单转换以及 varints 的编码和解码,varints 是一种使用一个或多个字节表示整型数据的方法,其中数值本身越小,其所占用的字节数越少。

接下来演示一下序列化数据后保存到本地,再反序列化本地的数据。

序列化数据后保存到本地

package main
 
import (
	"bytes"
	"encoding/binary"
	"fmt"
	"os"
)
 
type User struct {
	Age int32
}
 
funcmain() {
	file, err := os.Create("bin")
	if err != nil {
		fmt.Println("文件创建失败 ", err.Error())
		return
	}
	defer file.Close()
 
	for i := 1; i <= 10; i++ {
		data := User{
			int32(i),
		}
		var buf bytes.Buffer
		binary.Write(&buf, binary.LittleEndian, data)
		b := buf.Bytes()
		_, err = file.Write(b)
		if err != nil {
			fmt.Println("写入失败", err.Error())
			return
		}
	}
	fmt.Println("序列化成功")
}

反序列化本地的数据

package main
 
import (
	"bytes"
	"encoding/binary"
	"fmt"
	"os"
)
 
type User struct {
	Age int32
}
 
funcmain() {
	file, err := os.Open("bin")
	if err != nil {
		fmt.Println("文件打开失败 ", err.Error())
		return
	}
	defer file.Close()
 
	data := User{}
	for i := 1; i <= 10; i++ {
		b := make([]byte, 4)
		_, err = file.Read(b)
		if err != nil {
			fmt.Println("反序列化失败", err)
		}
		buffer := bytes.NewBuffer(b)
		err = binary.Read(buffer, binary.LittleEndian, &data)
		if err != nil {
			fmt.Println("二进制文件读取失败", err)
			return
		}
		fmt.Println("第", i, "个值为:", data)
	}
}

更多关于 encoding/binary 的内容请参考此包的源代码。

补充

除了上文的方法,下面小编还为大家整理了encoding/gob 包读写二进制文件的其他方法

gob是Golang自带的一个数据结构序列化的编码/解码工具,和JSON、XML、Google 的 protocol buffers类似。gob编码使用Encoder,解码使用Decoder。一种典型的应用场景就是RPC(remote procedure calls)。

接下来演示一下序列化数据后保存到本地,再反序列化本地的数据。

序列化数据后保存到本地

package main
 
import (
	"encoding/gob"
	"fmt"
	"os"
)
 
func main() {
	data := "测试读写二进制文件"
	file, err := os.Create("bin") // 创建文件
	if err != nil {
		fmt.Println("文件创建失败", err.Error())
		return
	}
	defer file.Close()
	encoder := gob.NewEncoder(file)
	err = encoder.Encode(data)
	if err != nil {
		fmt.Println("编码错误", err.Error())
		return
	}
}

反序列化本地的数据

package main
 
import (
	"encoding/gob"
	"fmt"
	"os"
)
 
func main() {
	file, err := os.Open("bin")
	if err != nil {
		fmt.Println("文件打开失败", err.Error())
		return
	}
	defer file.Close()
	decoder := gob.NewDecoder(file)
	var data string
	err = decoder.Decode(&data)
	if err != nil {
		fmt.Println("解码失败", err.Error())
		return
	}
	fmt.Println(data)
}

到此这篇关于Golang读写二进制文件方法总结的文章就介绍到这了,更多相关Golang读写二进制文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言二进制文件的读写操作

    Go语言二进制文件的读写操作

    本文主要介绍了Go语言二进制文件的读写操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go gRPC进阶教程gRPC转换HTTP

    Go gRPC进阶教程gRPC转换HTTP

    这篇文章主要为大家介绍了Go gRPC进阶教程gRPC转换HTTP教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • GoLang之go build命令的具体使用

    GoLang之go build命令的具体使用

    本文主要介绍了GoLang之go build命令的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Go类型断言提取测试接口值动态类型及静态转换确保类型接口编译安全

    Go类型断言提取测试接口值动态类型及静态转换确保类型接口编译安全

    这篇文章主要为大家介绍了Go类型断言提取测试接口值动态类型及静态转换确保类型实现特定接口的编译时安全性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Golang服务的请求调度的实现

    Golang服务的请求调度的实现

    Golang服务请求调度是一种使用Go语言实现的服务请求管理方法,本文主要介绍了Golang服务的请求调度的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • 基于Go+OpenCV实现人脸识别功能的详细示例

    基于Go+OpenCV实现人脸识别功能的详细示例

    OpenCV是一个强大的计算机视觉库,提供了丰富的图像处理和计算机视觉算法,本文将向你介绍在Mac上安装OpenCV的步骤,并演示如何使用Go的OpenCV绑定库进行人脸识别,需要的朋友可以参考下
    2023-07-07
  • 源码剖析Golang中singleflight的应用

    源码剖析Golang中singleflight的应用

    这篇文章主要为大家详细介绍了如何利用singleflight来避免缓存击穿,并剖析singleflight包的源码实现和工作原理,感兴趣的可以了解下
    2024-03-03
  • go colly 爬虫实现示例

    go colly 爬虫实现示例

    这篇文章主要为大家介绍了go colly 爬虫实现示例,效果是根据输入的浏览器cookie及excel必要行列号,从excel中读取公司名称,查询公司法人及电话号码。并写回到excel中指定行
    2022-09-09
  • 使用Go语言开发一个高并发系统

    使用Go语言开发一个高并发系统

    高并发系统是指能同时支持众多用户请求,处理大量并行计算的系统,这篇文章主要为大家详细介绍了如何使用Go语言开发一个高并发系统,感兴趣的小伙伴可以了解下
    2023-11-11
  • golang中gin框架接入jwt使用token验证身份

    golang中gin框架接入jwt使用token验证身份

    本文主要介绍了golang中gin框架接入jwt使用token验证身份,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12

最新评论