全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang写入二进制文件_Golang io Write二进制写入示例

Go写二进制文件须用binary.Write、io.Write或[]byte操作,禁用字符串转换;binary.Write要求结构体字段导出、字节序明确、不支持map/slice;io.Write需检查返回值;变长数据需手动编码长度前缀。

Go 语言写入二进制文件,核心是避免用 fmt.Fprintfstrconv 转字符串,必须用 binary.Writeio.Write 原始字节流,或直接操作 []byte

binary.Write 写结构体到二进制文件

适合固定格式的序列化(如网络协议头、自定义二进制格式),要求字段对齐、字节序明确。它不处理嵌套切片/指针,只支持基础类型和数组/结构体。

  • 必须传入 io.Writer(如 *os.File),不能传字符串或缓冲区
  • 字节序需显式指定:binary.LittleEndianbinary.BigEndian
  • 结构体字段必须是可导出的(首字母大写),否则 binary.Write 会忽略
  • 不支持 mapslice(除非长度固定且已知,用数组代替)
package main

import (
    "encoding/binary"
    "os"
)

type Header struct {
    Magic  uint32
    Length uint16
    Flags  byte
}

func main() {
    f, _ := os.Create("header.bin")
    defer f.Close()

    hdr := Header{Magic: 0x474f4c41, Length: 1024, Flags: 0x01}
    binary.Write(f, binary.LittleEndian, hdr) // 写入 7 字节:4+2+1
}

io.Write 直接写 []byte

最底层、最可控的方式,适用于已知原始字节序列的场景(如拼接协议帧、写图片头、加密后数据)。

  • Write 返回实际写入字节数和可能的错误,必须检查是否写满(尤其在循环中)
  • 不要假设 Write 一次写完全部数据;小文件通常没问题,但管道、网络或满磁盘时可能部分写入
  • 若需多次写入,推荐用 bufio.Writer 减少系统调用,但要注意 Flush() 否则数据滞留
package main

import (
    "os"
)

func main() {
    f, _ := os.Create("raw.bin")
    defer f.Close()

    data := []byte{0x00, 0x01, 0x02, 0xff, 0xaa}
    n, err := f.Write(data)
    if err != nil || n != len(data) {
        panic("write failed or partial")
    }
}

写入非对齐或变长二进制数据(如字符串 + 长度前缀)

当需要混合类型或动态长度时,binary.Write 不够用,得手动编码字节布局。

  • 字符串不能直接写——要先写长度(uint32),再写字节内容,否则读取端无法知道边界
  • 注意大小端一致性:写用 LittleEndian,读也必须用同一个
  • append 拼接字节切片比多次 Write 更高效,也更容易控制顺序
package main

import (
    "encoding/binary"
    "os"
)

func writeStringWithLen(w *os.File, s string) {
    b := []byte(s)
    header := make([]byte, 4)
    binary.LittleEndian.PutUint32(header, uint32(len(b)))

    w.Write(header)
    w.Write(b)
}

func main() {
    f, _ := os.Create("str.bin")
    defer f.Close()

    writeStringWithLen(f, "hello世界")
}

二进制写入真正容易出错的地方,不是语法,而是字节序误配、结构体字段未导出、或对 Write 返回值视而不见——尤其在跨平台或对接 C/C++ 程序时,一个字节错位,整段数据就不可读。


# go  # golang  # 编码  # app  # 字节  # ai  # c++  # 字符串  # 结构体  # 循环  # 指针  # 切片  # append  # map  # 不支持  # 返回值  # 变长  # 就不  # 适用于  # 自定义  # 要先  # 它不  # 或对  # 视而不见 


相关文章: 大连 网站制作,大连天途有线官网?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  家庭建站与云服务器建站,如何选择更优?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  简单实现Android文件上传  建站主机选哪种环境更利于SEO优化?  如何通过可视化优化提升建站效果?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  行程制作网站有哪些,第三方机票电子行程单怎么开?  建站VPS能否同时实现高效与安全翻墙?  海南网站制作公司有哪些,海口网是哪家的?  南平网站制作公司,2025年南平市事业单位报名时间?  建站主机与虚拟主机有何区别?如何选择最优方案?  制作表格网站有哪些,线上表格怎么弄?  宝塔建站后网页无法访问如何解决?  如何获取免费开源的自助建站系统源码?  已有域名和空间如何搭建网站?  教学网站制作软件,学习*后期制作的网站有哪些?  广州营销型建站服务商推荐:技术优势与SEO优化解析  香港服务器如何优化才能显著提升网站加载速度?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  北京企业网站设计制作公司,北京铁路集团官方网站?  如何在香港免费服务器上快速搭建网站?  三星网站视频制作教程下载,三星w23网页如何全屏?  活动邀请函制作网站有哪些,活动邀请函文案?  建站之星如何快速更换网站模板?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何通过cPanel快速搭建网站?  建站之星安装步骤有哪些常见问题?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  建站主机如何选?性能与价格怎样平衡?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  PHP 500报错的快速解决方法  网站代码制作软件有哪些,如何生成自己网站的代码?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  智能起名网站制作软件有哪些,制作logo的软件?  IOS倒计时设置UIButton标题title的抖动问题  网站制作报价单模板图片,小松挖机官方网站报价?  广东企业建站网站优化与SEO营销核心策略指南  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  建站主机SSH密钥生成步骤及常见问题解答?  如何配置IIS站点权限与局域网访问?  如何选择高效稳定的ISP建站解决方案?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何在Windows服务器上快速搭建网站?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何正确下载安装西数主机建站助手?  如何快速生成凡客建站的专业级图册? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。