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方法之间的调用之——传参方法
在最近项目需求中发现,完成一些功能的时候总是要调很多结构类似的方法,写起来很繁琐,所以就想写一个“万能”方法,是的代码更简洁.即:把一个方法作为参数传给这个“万能”方法,让它去执行你给定的方法,就类似 ...
随机推荐
- 关于Kafka high watermark的讨论2
之前写过一篇关于Kafka High watermark的文章,引起的讨论不少:有赞扬之声,但更多的是针对文中的内容被challenge,于是下定决心找个晚上熬夜再看了一遍,昨晚挑灯通读了一遍确实发现 ...
- Maven & Gradle 如何从中央仓库下载Jar包
https://mvnrepository.com/ maven 中央仓库 gradle可以轻松的完成Android项目对第三方jar包文件的依赖下载,再也不需要我们手动下载jar包,然后拷贝到 ...
- cordova 插件 调用iOS社交化分享(ShareSDK:微信QQ分享)
1.github上已有的插件:https://github.com/nwpuhmz/ShareSDKPlugin 2.安装插件 cordova plugin add https://github.co ...
- 第八天py
我发现这个老师讲的太基础只是我懒得跳过而已想慢慢听 列表公共功能 索引 切片 for 长度 特有功能 翻转 排序 追加 插入 索引位置 删除
- es7 class装饰器
文档http://es6.ruanyifeng.com/#docs/decorator ts文档 https://www.tslang.cn/docs/handbook/decorators.html ...
- 低耦合高内聚 - 不要把所有东西都放在 vuex中
我就举一个例子.比如,我想看电视,是否需要遥控器??请认真思考这个问题. 看似电视与“我”已经解耦了.然而,我需要通过遥控器去看电视,我的目的是看电视,但是我却需要依赖遥控器这个中间件.这就变相地将“ ...
- elasticsearch与solr区别
solr:优点1.Solr有一个更大.更成熟的用户.开发和贡献者社区.2.支持添加多种格式的索引,如:HTML.PDF.微软 Office 系列软件格式以及 JSON.XML.CSV 等纯文本格式.3 ...
- 试水Spring Cloud Hystrix
Spring Cloud Hystrix是一个容错库,它实现了断路器模式,使得当服务发生异常时,会自动切断连接,并将请求引导至预设的回调方法. 服务端 在Spring Tool Suite的文件菜单中 ...
- Apache的项目列表
这里是Apache的项目列表,Apache Http Server也在这里 https://projects.apache.org/projects.html?name
- POJ 1816 - Wild Words - [字典树+DFS]
题目链接: http://poj.org/problem?id=1816 http://bailian.openjudge.cn/practice/1816?lang=en_US Time Limit ...