golang 对struct进行Serialize的方法,即将存取二进制文件到struct的方法
方法一:
serialize 的标准方法:
方法二:
下面是自己实现的 serialize 方法,不推荐自己实现,应该用标准方法。
代码如下:
package main import (
"bytes"
"encoding/binary"
"fmt"
"log"
"os"
) //this type represnts a record with three fields
type payload struct {
Three int32
} func main() {
writeFile()
readFile()
} func readFile() {
file, err := os.Open("test.bin")
defer file.Close()
if err != nil {
log.Fatal(err)
} m := payload{}
for i := ; i < ; i++ {
data := readNextBytes(file, )
buffer := bytes.NewBuffer(data)
err = binary.Read(buffer, binary.BigEndian, &m)
if err != nil {
log.Fatal("binary.Read failed", err)
} fmt.Println("m is: ", m)
}
} func readNextBytes(file *os.File, number int) []byte {
bytes := make([]byte, number) _, err := file.Read(bytes)
if err != nil {
log.Fatal(err)
} return bytes
} func writeFile() {
file, err := os.Create("test.bin")
defer file.Close()
if err != nil {
log.Fatal(err)
} for i := ; i < ; i++ {
s := &payload{
int32(i),
}
fmt.Println(s)
var bin_buf bytes.Buffer
binary.Write(&bin_buf, binary.BigEndian, s) b := bin_buf.Bytes()
l := len(b)
fmt.Println("write len: ", l) writeNextBytes(file, b)
}
} func writeNextBytes(file *os.File, bytes []byte) {
_, err := file.Write(bytes) if err != nil {
log.Fatal(err)
}
}
除了将数据放进结构体之外,你还可以直接将数据放进结构体对象的某个成员里:
binary.Read(buffer, binary.BigEndian, &m.Two)
不过要保证buffer与成员的内存长度一样。
# 注意,这里必须注意payload结构里的任何field成员都不能是 int,必须制定成员的byte长度,也即必须使用 int32, int64, float32等等,不能使用 int, float。因为不指定长度若将它存到磁盘并读取回来时会产生歧义,不知道读写多少个byte的。
另外,如果出现这种错误: reflect: reflect.Value.SetUint using value obtained using unexported field, 是因为payload结构体内的Field的名称小写引起的,改成首字母大写即可。
如果你向确认结构体是否被正确的赋值了,可以:
bs := make([]byte, )
binary.LittleEndian.PutUint32(bs, )
fmt.Println(bs)
golang 对struct进行Serialize的方法,即将存取二进制文件到struct的方法的更多相关文章
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
- JS调用OC方法并传值,OC调用JS方法并传值////////////////////////zz
iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码) 最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点 ...
- YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法
上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...
- 类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,
编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 ...
- 【原】ios的hitTest方法以及不规则区域内触摸事件处理方法
概述 在正常的使用场景中,我们处理了比较多的矩形区域内触摸事件,比如UIButton.UIControl.一般来说,这些控件的图形以及触摸区域都是矩形或者圆角矩形的.但是在一些特殊应用场景中我们有时不 ...
- struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法
struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/19996629 开篇 在我的上一篇博客 深入理解Java中为什么内部类可以访问外部类的成 ...
- [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...
- js方法之间的调用之——传参方法
在最近项目需求中发现,完成一些功能的时候总是要调很多结构类似的方法,写起来很繁琐,所以就想写一个“万能”方法,是的代码更简洁.即:把一个方法作为参数传给这个“万能”方法,让它去执行你给定的方法,就类似 ...
随机推荐
- zeromq使用模式实验总结
zeromq:官网 安装 demo及各语言绑定 golang绑定 实验环境:win10 x64/centos6 x86 zeromq4.0.6 zmq三种模式:push/pull.pub/sub.r ...
- collections模块和os模块
collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...
- 智能文件选择列表—— bat 批处理
智能文件选择列表 *.wim @echo off setlocal enabledelayedexpansion title 智能文件选择列表 pushd %~dp0 & cd /d %~dp ...
- tsm 切记
切记不可删除节点,如果删除下面带的数据也会删除
- db2 v11 安装测试
一.准备环境: 修改/etc/hosts如下配置: #vi /etc/hosts 127.0.0.1 localhost 修改系统内核参数 # vi /etc/sysctl.conf kerne ...
- 蚂蚁金服缘何自研Service Mesh?
2018年,微服务方兴未艾,Service Mesh(服务网格)又快速崛起.有观点认为,2018年可被称之为“Service Mesh元年”,在未来两年中,Service Mesh将迎来爆发式增长,成 ...
- 矩阵游戏|ZJOI2007|BZOJ1059|codevs1433|luoguP1129|二分图匹配|匈牙利算法|Elena
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MB Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩 ...
- 无法在Web服务器上启动调试。
Ⅰ x 操作超时 有关详细信息,请单击"帮助" x IIS--应用程序池--找到用到的程序池--回收 2 报这个错误的时候,我的IIS应用程序池只有一个>>> ...
- 恢复制作了系统盘的U盘
制作了系统盘的U盘通常容量会变得很小(比如用win32制作的系统盘) 此时在系统安装完成之后就要把U盘恢复,否则就无法正常使用了 步骤: 1.win+r打开程序搜索框,输入cmd打开dos窗口 2.在 ...
- webstom 快捷键