Go -- 中结构体与字节数组能相互转化

编码时如下,假设默认你的结构体为data

func Encode(data interface{}) ([]byte, error) {
        buf := bytes.NewBuffer(nil)
        enc := gob.NewEncoder(buf)
        err := enc.Encode(data)
        if err != nil {
            return nil, err
        }
        return buf.Bytes(), nil
    } 

解码时如下,data为需要解码的字节数组,to为相应的接收结构体,记住to的结构体结构应与被编码的data相一致(这就是gob相对于json的缺陷,解码需要预先知道被解码内容的结构),解码后内容保存在to里面,直接使用to即可

func Decode(data []byte, to interface{}) error {
    buf := bytes.NewBuffer(data)
    dec := gob.NewDecoder(buf)
    return dec.Decode(to)
} 

使用的时候:

b, err := Encode(data)
    if err != nil {
       //错误处理
    }
    if err := Decode(b, &to); err != nil {
        //错误处理
    }
时间: 2024-10-09 20:57:43

Go -- 中结构体与字节数组能相互转化的相关文章

c#中关于结构体和字节数组转化

最近在使用结构体与字节数组转化来实现socket间数据传输.现在开始整理一下.对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Runtime.InteropServices; namespace FileSendClient { [StructL

C#结构体和字节数组的转换函数

在通信过程中,一般我们都会操作到字节数组.特别是希望在不同语言编程进行操作的时候. 虽然C#提供了序列化的支持,不用字节数组也行.但操作字节数组肯定会碰到. 一般都会采用结构来表示字节数组.但结构与字节数组直接的转换实在很麻烦. 字节操作不但容易出错,而且每增加一个结构,就自己实现一遍,实在是烦不胜烦. 有没有简单的方法呢?当然有.可以采用非托管区的一些方法来实现. 首先,导入命名空间:System.Runtime.InteropServices; 定义结构的时候,要给结构指定特性. 如: //

C#中结构体定义并转换字节数组

最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一点非常重要. 首先是结构体定义,一些基本的数据类型,C#与C++都是可以匹配的: [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct Head { public

C#中结构体与字节流互相转换

1.定义与C++对应的C#结构体 在c#中的结构体不能定义指针,不能定义字符数组,只能在里面定义字符数组的引用. C++的消息结构体如下: //消息格式 4+16+4+4= 28个字节 struct cs_message{ u32_t cmd_type; char username[16]; u32_t dstID; u32_t srcID; }; C#定义的结构体如下: [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct

C语言中结构体赋值问题的讨论(转载)

今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言中结构体赋值的问题吧: 结构体直接赋值的实现 下面是一个实例: #include <stdio.h> struct Foo { char a; int b; double c; }foo1, foo2; //define two structs with three different field

linux中结构体对齐【转】

转自:https://blog.csdn.net/suifengpiao_2011/article/details/47260085 linux中定义对齐字节 typedef struct  sdk_handler { char comm_ver[10];  char name[20]; char reserve[20]; }PACKED  sdk_handler_t; #define PACKED //__attribute__((aligned(1),packed))  // 一字节对齐 首

C++中结构体和类的区别

在C++中,结构体是一种特殊形态的类. 结构体和类的唯一区别就是:  结构体和类具有不同的默认访问控制属性. 类中,对于未指定访问控制属性的成员,其访问控制属性为私有类型(private) 结构体中,对于未指定任何访问控制属性的成员,其访问控制属性为公有类型(public) C++中,不使用结构体丝毫不会影响程序的表达能力.C++之所以要引入结构体,是为了保持和C程序的兼容性. 但有时仍会在C++中使用结构体,是因为,可以使用结构体将不同类型数据组成整体,方便于保存数据.(若用类来保存,因类中成

OpenCV 中结构体IplImage 成员width widthStep使用注意事项

OpenCV 中结构体IplImage 成员width,widthStep使用注意事项 width 是指的图片宽度是多少个像素,而这里widthStep是指的图片中的每一行占用多少个字节. 而且,widthStep会有字节对齐. 当需要对每个像素进行操作的时候,这里最好用widthStep做行递增变换. 比方说这里就是一个例子,明显,ptr_pixel_tmp是指向double类型的三通道图像,而ptr_pixel_img是unsigned char类型的三通道图像,double占八个字节. 于

OC类中一些细节问题(对象类存储、类中结构体的用法)

一:OC中得方法名 注意:方法名冒号和后面的and方法名冒号  都是方法名 一:对象的存储细节 类加载到代码区(包括类中得属性和方法).对象动态加载到堆内存中.指向对象的指针存放在栈区. 三:定义类常见的错误 定义类的时候,常见的错误 1)类的定义不能嵌套 2)不要漏写 @end 3) 不要忘记写实现类(如果忘记写了,编译不会报错,运行时候才报错) 4)定义成员变量的大括号经常漏写 5) 如果不写@interface 只有 @implementation 这可以,但是会报警告,建议不要这么写 6