使用 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读写二进制文件内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:Golang读写二进制文件方法总结
- Ruby的字符串与数组求最大值的相关问题讨论 2023-07-22
- Golang http.Client设置超时 2023-09-05
- Ruby 迭代器知识汇总 2023-07-23
- R语言关于二项分布知识点总结 2022-11-30
- Swift超详细讲解指针 2023-07-08
- R语言绘图数据可视化pie chart饼图 2022-12-10
- Go Web开发进阶实战(gin框架) 2023-09-06
- R语言-如何切换科学计数法和更换小数点位数 2022-11-23
- 汇编语言程序设计之根据输入改变屏幕颜色的代码 2023-07-06
- Ruby on Rails在Ping ++ 平台实现支付 2023-07-22
