使用os.WriteFile可直接写入小量二进制数据,bufio.Writer适合大量或频繁写入以提升性能,encoding/binary支持结构化数据按字节序写入,需注意缓冲刷新与错误处理。

在Go语言中,写入二进制文件是一个常见的需求,尤其是在处理图像、音频、序列化数据或网络传输时。Golang 提供了标准库支持高效地操作二进制数据。下面介绍几种常用的写入二进制文件的方法,并结合实际示例说明。
使用 os.WriteFile 直接写入字节切片
对于小量数据,最简单的方式是将数据组织成 []byte,然后使用 os.WriteFile 一次性写入文件。
- 适用于已知完整数据且不需要流式处理的场景
- 操作简洁,适合配置文件、缓存数据等写入
示例:
package main
import (
"os"
)
func main() {
data := []byte{0x48, 0x65, 0x6c, 0x6c, 0x6f} // "Hello" 的 ASCII 码
err := os.WriteFile("output.bin", data, 0644)
if err != nil {
panic(err)
}
}
使用 bufio.Writer 提高写入效率
当需要频繁写入或数据量较大时,使用 bufio.Writer 可以减少系统调用次数,提升性能。
立即学习“go语言免费学习笔记(深入)”;
- 缓冲机制减少磁盘 I/O 次数
- 适合分批写入或循环写入场景
示例:写入多个字节块
package main
import (
"bufio"
"os"
)
func main() {
file, err := os.Create("data.bin")
if err != nil {
panic(err)
}
defer file.Close()
writer := bufio.NewWriter(file)
chunks := [][]byte{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
for _, chunk := range chunks {
_, err := writer.Write(chunk)
if err != nil {
panic(err)
}
}
// 别忘了刷新缓冲区
err = writer.Flush()
if err != nil {
panic(err)
}
}
使用 encoding/binary 写入结构化数据
当你需要将 Go 的结构体或基本类型(如 int32、float64)按二进制格式写入文件时,encoding/binary 包非常有用。
- 支持大端(BigEndian)和小端(LittleEndian)字节序
- 常用于协议数据、文件头、序列化存储
示例:写入整数和浮点数
package main
import (
"encoding/binary"
"os"
)
func main() {
file, err := os.Create("numbers.bin")
if err != nil {
panic(err)
}
defer file.Close()
var value int32 = 1000
err = binary.Write(file, binary.LittleEndian, value)
if err != nil {
panic(err)
}
var f float64 = 3.14159
err = binary.Write(file, binary.LittleEndian, f)
if err != nil {
panic(err)
}
}
写入自定义结构体
你可以将结构体按字段顺序逐个写入,注意字段必须可导出(大写字母开头),否则 binary.Write 无法访问。
type Header struct {
ID uint32
Size uint32
Name [16]byte
}
func main() {
file, _ := os.Create("header.bin")
defer file.Close()
name := "example"
var nameBytes [16]byte
copy(nameBytes[:], name)
header := Header{
ID: 1,
Size: 1024,
Name: nameBytes,
}
binary.Write(file, binary.LittleEndian, header)
}
基本上就这些常用方法。根据你的数据类型和性能需求选择合适的方式:简单数据用 WriteFile,大量写入用 bufio,结构化数据用 binary 包。注意字节序一致性,特别是在跨平台场景下。不复杂但容易忽略的是刷新缓冲和错误处理,别让程序默默失败。










