首页 > 其他分享 >go binary 与 gob

go binary 与 gob

时间:2024-07-02 20:33:28浏览次数:15  
标签:binary 字节 err encoding nil gob go

 

 

在 Go 中,除了使用 encoding/binary 包将结构体转换为字节切片,还可以使用 encoding/gob 包进行序列化。两者各有优缺点,适用于不同的场景。以下是对比和示例:

encoding/binary

优点:

  1. 高效:直接将结构体的内存布局写入字节切片,效率较高。
  2. 简单:适用于简单的固定大小结构体。
  3. 跨语言兼容性:因为只是简单的字节转换,如果遵循相同的字节顺序和数据布局,其他编程语言可以解析这些字节。

缺点:

  1. 灵活性差:只能处理固定大小的结构体,对字符串和切片等动态大小的数据类型支持不佳。
  2. 手动处理字节顺序:需要手动处理字节顺序(大端或小端)。
  3. 不支持版本控制:结构体字段的增加或修改需要手动维护字节布局。

encoding/gob

优点:

  1. 灵活性:支持复杂的结构体,包括嵌套结构体、切片和映射等。
  2. 自动处理:自动处理字节顺序和动态大小的数据类型。
  3. 支持版本控制:可以处理结构体字段的增加或修改,只要字段名称不变。
  4. Go 专用:Go 内置支持,适用于 Go 语言的应用程序间通信。

缺点:

  1. 性能:由于需要进行额外的编码和解码操作,性能可能不如 encoding/binary
  2. 数据格式:生成的数据格式是 Go 特有的,其他语言解析较为困难,不适用于跨语言的数据传输。

示例

encoding/binary 示例

go package main import ( "bytes" "encoding/binary" "fmt" ) // 定义一个结构体 type MyStruct struct { ID int32 Name [20]byte Value float32 } // 将结构体转换为字节切片 func structToBytes(s MyStruct) ([]byte, error) { buf := new(bytes.Buffer) err := binary.Write(buf, binary.LittleEndian, s) if err != nil { return nil, err } return buf.Bytes(), nil } func main() { myStruct := MyStruct{ ID: 123, Name: [20]byte{'G', 'o', 'L', 'a', 'n', 'g'}, Value: 3.14, } data, err := structToBytes(myStruct) if err != nil { fmt.Println("Failed to convert struct to bytes:", err) return } fmt.Println("Byte slice:", data) }

encoding/gob 示例

go package main import ( "bytes" "encoding/gob" "fmt" ) // 定义一个结构体 type MyStruct struct { ID int32 Name string Value float32 } // 将结构体转换为字节切片 func structToBytes(s MyStruct) ([]byte, error) { buf := new(bytes.Buffer) enc := gob.NewEncoder(buf) err := enc.Encode(s) if err != nil { return nil, err } return buf.Bytes(), nil } // 从字节切片转换回结构体 func bytesToStruct(data []byte) (MyStruct, error) { buf := bytes.NewBuffer(data) dec := gob.NewDecoder(buf) var s MyStruct err := dec.Decode(&s) if err != nil { return MyStruct{}, err } return s, nil } func main() { myStruct := MyStruct{ ID: 123, Name: "GoLang", Value: 3.14, } data, err := structToBytes(myStruct) if err != nil { fmt.Println("Failed to convert struct to bytes:", err) return } fmt.Println("Byte slice:", data) // 将字节切片转换回结构体 newStruct, err := bytesToStruct(data) if err != nil { fmt.Println("Failed to convert bytes to struct:", err) return } fmt.Printf("Decoded struct: %+v\n", newStruct) }

总结

  • 选择 encoding/binary:如果需要高效处理固定大小的简单结构体,且需要跨语言兼容性,可以选择 encoding/binary
  • 选择 encoding/gob:如果需要处理复杂结构体、动态数据类型,并且仅在 Go 应用之间进行数据传输,推荐使用 encoding/gob

根据具体应用场景选择合适的方法,可以更好地满足性能和功能需求

标签:binary,字节,err,encoding,nil,gob,go
From: https://www.cnblogs.com/rebrobot/p/18280495

相关文章

  • 57.Django框架之序列化输出
    Django框架【一】序列化组件1)使用案例在前端获取到后端用户表里面的所有数据,并且格式是列表套字典#创建模型表classUser(models.Model): username=models.CharField(max_length=32,verbose_name="姓名")age=models.IntegerField(verbose_name="年龄")2)基于J......
  • Google常用搜索语法
    1.常用内容搜索语法1、intitle:搜索网页标题中包含有特定字符的网页。例如输入“intitle:后台”,这样网页标题中带有c后台的网页都会被搜索出来。2、intext:搜索网页正文内容中的指定字符,例如输入“intext:后台管理”。这个语法类似我们平时在某些网站中使用的“文章内容搜索......
  • go汇编调试方法
    plan9基本知识:首先我们学习如何用vscode+delve来调试go的plan9汇编代码.首先我们用vscode配置好go的运行环境.能正确打印helloworld代码.编写代码://main.gopackagemainfuncmain(){ varaaa=Sum(2,4) print(aaa)}funcSum(x,yint)int//add.sTEXT·Sum(......
  • Windows服务器下配置Gogs HTTP自动跳转HTTPS
    在前面的文章中,介绍了如何在Windows服务器下搭建自己的git服务器,在文末介绍了开启HTTPS的方法。https://www.cnblogs.com/zhaotianff/p/17887191.html 但是开启https后,无法使用http访问了,所以需要urlrewrite,找了一圈,发现网上的教程都是Linux下基于Nginx的。 通过尝试,找到......
  • go语言之map取值
    packagemainimport("fmt")funcmain(){//定义一个maptemp_dict:=make(map[string]string)temp_dict["A"]="A__value"//1获取某一个key的值//1.1两个返回值r1_value,r1_exisit:=temp_dict["A"]......
  • go中实现日志级别与切割,日志配置热生效,pprof的技术解析
    引言在线上分布式系统和微服务架构中,日志记录是排查问题、调试程序和监控服务运行状态的重要手段。合理设置日志级别,可以帮助开发和运维人员有效地获取所需信息。然而,在实际运行中,常常需要在不重启服务的情况下动态调整日志级别,以适应不同的调试需求和运行环境。本文基于g......
  • 图神经网络版本的Kolmogorov Arnold(KAN)代码实现和效果对比
    KolmogorovArnoldNetworks(KAN)最近作为MLP的替代而流行起来,KANs使用Kolmogorov-Arnold表示定理的属性,该定理允许神经网络的激活函数在边缘上执行,这使得激活函数“可学习”并改进它们。目前我们看到有很多使用KAN替代MLP的实验,但是目前来说对于图神经网络来说还没有类似的实验......
  • 云原生周刊:Argo Rollouts 支持 Kubernetes Gateway API 1.0 | 2024.7.1
    开源项目KubetoolsRecommenderSystemKubetoolsRecommenderSystem(Krs)是一个基于GenAI的工具,用于帮助管理和优化Kubernetes集群。buoybuoy是Kubernetes的声明式TUI仪表板。你可以在JSON文件中定义仪表板,它将从Kubernetes集群中获取信息并构建仪表板,以便在......
  • Godot游戏学习笔记(二)
    Godot学习笔记(二)前言今天这部分是想做一个基本的背包系统,既可以存放基本的物品。一、个人思路我认为的背包系统中主要有三项基本的物品、用于存放物品的单位和背包页面这三个部分,其中第二个部分用于存放物品的单位可以不用单独构建,但是构建了会更方便管理,所以我加上了第......
  • 最新扣子(Coze)实战案例:图像流工具之创建一个精美的LOGO,完全免费教程
    ......