方法一:

serialize 的标准方法:

使用gobbase64 或 base58。

方法二:

下面是自己实现的 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的方法的更多相关文章

  1. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  2. JS调用OC方法并传值,OC调用JS方法并传值////////////////////////zz

     iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码)     最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点 ...

  3. YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

    上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...

  4. 类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,

    编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 ...

  5. 【原】ios的hitTest方法以及不规则区域内触摸事件处理方法

    概述 在正常的使用场景中,我们处理了比较多的矩形区域内触摸事件,比如UIButton.UIControl.一般来说,这些控件的图形以及触摸区域都是矩形或者圆角矩形的.但是在一些特殊应用场景中我们有时不 ...

  6. struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法

    struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法

  7. 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量

    好文转载:http://blog.csdn.net/zhangjg_blog/article/details/19996629 开篇 在我的上一篇博客 深入理解Java中为什么内部类可以访问外部类的成 ...

  8. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  9. js方法之间的调用之——传参方法

    在最近项目需求中发现,完成一些功能的时候总是要调很多结构类似的方法,写起来很繁琐,所以就想写一个“万能”方法,是的代码更简洁.即:把一个方法作为参数传给这个“万能”方法,让它去执行你给定的方法,就类似 ...

随机推荐

  1. [Android] 基于 Linux 命令行构建 Android 应用(一):关于 Android 项目

    关于 Android 项目 项目是保存源代码和资源文件的容器. 谷歌提供的 Android SDK 工具只能对具有固定目录结构的项目进行编译和打包.因此强烈建议使用 Eclipse + ADT 或者 ...

  2. Android使用Fragment实现TabHost效果

    现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加入Fragment的时候,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题,但现在即使只是在手机上, ...

  3. Linux驱动技术(三) _DMA编程

    DMA即Direct Memory Access,是一种允许外设直接存取内存数据而没有CPU参与的技术,当外设对于该块内存的读写完成之后,DMAC通过中断通知CPU,这种技术多用于对数据量和数据传输速 ...

  4. 使用SpringContextHolder获取bean实例

    public static IConstantFactory me(){ return SpringContextHolder.getBean(beanName:"constantFacto ...

  5. np.unravel_index

      >>> np.unravel_index([22, 41, 37], (7,6)) (array([3, 6, 6]), array([4, 5, 1]))>>> ...

  6. 难以接受你的改变:从project.json到.csproj

    自从微软做了一个艰难的决定——.NET Core彻底放弃project.json,全面改回.csproj——至今,虽然赞美之声不断,但我依然不喜欢也难以接受这样的改变. 难以接受主要有两方面的原因: ...

  7. stm32 硬件错误

    进入该模式,程序死机. 一般来说都是内存错误 1. 数组越界,装入数据溢出, 2. 堆和栈设置不当,这里面硬件的堆和栈在汇编文件中,如果有freertos等,重点检查,任务堆栈使用情况,一般任务堆栈溢 ...

  8. ssh agent-forward

    出于安全性考虑,服务器迁移后,将统一使用 SSH agent forwarding 方式登录所有服务器, 原则上所有 ssh 操作都要通过跳板机,而且跳板机上禁止存储一切私钥. 在此说明一下后续ssh ...

  9. 使用PrintDBGridEh进行打印 (转)

    使用PrintDBGridEh进行打印 (转)   if not ADOQuery1.Active then exit;  if ADOQuery1.RecordCount<=0 then ex ...

  10. day5_集合

    集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据 集合的作用: 1.它可以把一个列表中重复的数据去掉,而不需要你再写判断---天生去重 2.可以做关系 ...