iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang怎么使用gob实现结构体的序列化
  • 884
分享到

Golang怎么使用gob实现结构体的序列化

2023-07-05 10:07:29 884人浏览 八月长安
摘要

本文小编为大家详细介绍“golang怎么使用Gob实现结构体的序列化”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么使用gob实现结构体的序列化”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Gol

本文小编为大家详细介绍“golang怎么使用Gob实现结构体的序列化”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么使用gob实现结构体的序列化”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

Golang有自己的序列化格式,称为gob。使用gob可以对结构进行编码和解码。你可以使用其他格式,如JSON, XML, protobuff等,具体选择要根据实际需求,但当接收和发送都为Golang,我建议使用Go的gob格式。

Gob简介

gob在kg/encoding/gob包中:

  • gob流是自描述的,这意味着我们不需要创建单独的文件来解释(使用protobuff格式需要创建文件)

  • gob流中的每个数据项之前都有其类型说明(一些预定义的类型)

Gob包很简单,仅包括8个函数和5个类型:

func ReGISter(value interface{})func RegisterName(name string, value interface{})type CommonTypetype Decoderfunc NewDecoder(r io.Reader) *Decoderfunc (dec *Decoder) Decode(e interface{}) errorfunc (dec *Decoder) DecodeValue(v reflect.Value) errortype Encoderfunc NewEncoder(w io.Writer) *Encoderfunc (enc *Encoder) Encode(e interface{}) errorfunc (enc *Encoder) EncodeValue(value reflect.Value) errortype GobDecodertype GobEncoder

单个对象序列化

首先定义student结构体,包括两个字段Name和Age.

使用gob.NewEncoder和gob.NewDecoder方法,接收io.Writer 和 io.Reader 对象,用于读写文件:

package mainimport (       "fmt"       "os"       "encoding/gob")type Student struct {       Name string       Age int32}func main() {       fmt.Println("Gob Example")       student := Student{"Ketan Parmar",35}       err := writeGob("./student.gob",student)       if err != nil{              fmt.Println(err)       }       var studentRead = new (Student)       err = readGob("./student.gob",studentRead)       if err != nil {              fmt.Println(err)       } else {              fmt.Println(studentRead.Name, "\t", studentRead.Age)       }}func writeGob(filePath string,object interface{}) error {       file, err := os.Create(filePath)       if err == nil {              encoder := gob.NewEncoder(file)              encoder.Encode(object)       }       file.Close()       return err}func readGob(filePath string,object interface{}) error {       file, err := os.Open(filePath)       if err == nil {              decoder := gob.NewDecoder(file)              err = decoder.Decode(object)       }       file.Close()       return err}

列表数据序列化

首先创建student结构体数组或slice,然后填充数据。下面示例无需修改readGob和writeGob函数:

package mainimport (       "fmt"       "os"       "encoding/gob")type Student struct {       Name string       Age int32}type Students []Studentfunc main() {       fmt.Println("Gob Example")       students := Students{}       students = append(students,Student{"Student 1",20})       students = append(students,Student{"Student 2",25})       students = append(students,Student{"Student 3",30})       err := writeGob("./student.gob",students)       if err != nil{              fmt.Println(err)       }       var studentRead = new (Students)       err = readGob("./student.gob",studentRead)       if err != nil {              fmt.Println(err)       } else {              for _,v := range *studentRead{                     fmt.Println(v.Name, "\t", v.Age)              }       }}

上面两个示例主要使用了NewEncoder 和 NewDecoder,接下来看看其他函数:Register, Encode, EncodeValue, Decode 和 DecodeValue。

Encode 和 Decode 函数主要用于网络应用程序,方法签名如下:

func (dec *Decoder) Decode(e interface{}) error
func (enc *Encoder) Encode(e interface{}) error

简单编码示例

package mainimport (   "fmt"   "encoding/gob"   "bytes")type Student struct {   Name string   Age int32}func main() {   fmt.Println("Gob Example")   studentEncode := Student{Name:"Ketan",Age:30}   var b bytes.Buffer   e := gob.NewEncoder(&b)   if err := e.Encode(studentEncode); err != nil {      panic(err)   }   fmt.Println("Encoded Struct ", b)   var studentDecode Student   d := gob.NewDecoder(&b)   if err := d.Decode(&studentDecode); err != nil {      panic(err)   }   fmt.Println("Decoded Struct ", studentDecode.Name,"\t",studentDecode.Age)}

上面示例把student结构序列化、反序列化。序列化后存储在字节buffer变量b中,先可以使用b在网络中传输。要解码仅需要创建相同结构对象并提供其地址。studentDecode变量获得解码的内容。

编码在tcp连接中使用

TCP客户端:打开连接使用gob.Encoder方法编码数据进行传输:

package mainimport (   "fmt"   "encoding/gob"   "net"   "log")type Student struct {   Name string   Age int32}func main() {   fmt.Println("Client")   //create structure object    studentEncode := Student{Name:"Ketan",Age:30}   fmt.Println("start client");   // dial TCP connection   conn, err := net.Dial("tcp", "localhost:8080")   if err != nil {      log.Fatal("Connection error", err)   }   //Create encoder object, We are passing connection object in Encoder   encoder := gob.NewEncoder(conn)   // Encode Structure, IT will pass student object over TCP connection   encoder.Encode(studentEncode)   // close connection   conn.Close()   fmt.Println("done");}

TCP Server: 监听8080端口,在go协程中处理所有客户端,使用gob.Decoder方法解码student结构体并输出:

package mainimport (   "fmt"   "net"   "encoding/gob")type Student struct {   Name string   Age int32}func handleConnection(conn net.Conn) {   // create new decoder object and provide connection   dec := gob.NewDecoder(conn)   // create blank student object   p := &Student{}   // decode serialize data   dec.Decode(p)   // print   fmt.Println("Hello ",p.Name,", Your Age is ",p.Age);   // close connection for that client   conn.Close()}func main() {   fmt.Println("Server")   // start TCP server and listen on port 8080   ln, err := net.Listen("tcp", ":8080")   if err != nil {      // handle error      panic(err)   }   for {      // this blocks until connection or error      conn, err := ln.Accept()      if err != nil {         // handle error         continue      }      // a goroutine handles conn so that the loop can accept other connections      go handleConnection(conn)   }}

上文中没有实现序列化,本文给出golang-ttl-map实现:

func (h *Heap) append(data Data) (err error) {h.fileMx.Lock()defer h.fileMx.Unlock()       // 打开文件var file *os.Filefile, err = os.OpenFile(h.filePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0755)if err != nil {return}defer func() {_ = file.Sync()}()defer func() {_ = file.Close()}()       // 定义buffervar buf bytes.Bufferenc := gob.NewEncoder(&buf)       // 序列化err = enc.Encode(data)if err != nil {return}bs := buf.Bytes()bs = append(bs, '\n')       // 写入文件_, err = file.Write(bs)if err != nil {return}return}

读到这里,这篇“Golang怎么使用gob实现结构体的序列化”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网GO频道。

您可能感兴趣的文档:

--结束END--

本文标题: Golang怎么使用gob实现结构体的序列化

本文链接: https://www.lsjlt.com/news/351040.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang怎么使用gob实现结构体的序列化
    本文小编为大家详细介绍“Golang怎么使用gob实现结构体的序列化”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么使用gob实现结构体的序列化”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Gol...
    99+
    2023-07-05
  • Golang使用gob实现结构体的序列化过程详解
    目录Gob简介单个对象序列化列表数据序列化简单编码示例编码在TCP连接中使用Golang有自己的序列化格式,称为gob。使用gob可以对结构进行编码和解码。你可以使用其他格式,如JS...
    99+
    2023-03-08
    Golang序列化结构体 Golang gob序列化
  • golang结构体序列化怎么实现
    在Go中,可以使用encoding/json包来实现结构体的序列化和反序列化。 首先,需要导入encoding/json包: imp...
    99+
    2023-10-22
    golang
  • 用Gob在Golang中实现数据序列化/反序列化
    在 golang 中使用 gob 包序列化数据需以下步骤:为要序列化的类型实现 gobencode 和 gobdecode 接口。使用 gob.newencoder 和 gob.newd...
    99+
    2024-04-08
    golang 序列化/反序列化 标准库
  • Go 结构体序列化的实现
    目录更改JSON对象中的键在JSON对象中隐藏结构体字段附加内容结构体标签string指令本文,我们将回到之前写的showMovieHandler方法,并更新它以返回一个JSON响应...
    99+
    2024-04-02
  • Go结构体序列化的实现是怎样的
    Go结构体序列化的实现是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们将回到之前写的showMovieHandler方法,并更新它以返回一个JSON响...
    99+
    2023-06-29
  • Go内置序列化库gob的使用
    目录概述gob库的使用示例1. 序列化和反序列化基本数据类型2. 序列化和反序列化结构体3. 注册数据类型概述 Gob 是Go语言自己以二进制形式序列化和反序列化程序数据的格式,可以...
    99+
    2023-05-18
    Go gob 序列化 Go gob
  • 带指针的结构体序列化
    哈喽!大家好,很高兴又见面了,我是编程网的一名作者,今天由我给大家带来一篇《带指针的结构体序列化》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看...
    99+
    2024-04-04
  • Golang怎么实现Json转结构体
    这篇文章主要讲解了“Golang怎么实现Json转结构体”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang怎么实现Json转结构体”吧!请求Zabbix API,通过itemid获取...
    99+
    2023-07-05
  • Golang中Json的序列化和反序列化怎么使用
    这篇文章主要介绍“Golang中Json的序列化和反序列化怎么使用”,在日常操作中,相信很多人在Golang中Json的序列化和反序列化怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang中Js...
    99+
    2023-06-30
  • Golang结构体映射mapstructure库怎么使用
    这篇文章主要介绍“Golang结构体映射mapstructure库怎么使用”,在日常操作中,相信很多人在Golang结构体映射mapstructure库怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”G...
    99+
    2023-07-04
  • SpringBoot怎么结合Redis实现序列化
    这篇文章主要介绍了SpringBoot怎么结合Redis实现序列化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么结合Redis实现序列化文章都会有所收获,下面我们一起来看看吧。配置类配置...
    99+
    2023-07-02
  • JavaScript中怎么序列化链式结构
    这篇文章给大家介绍JavaScript中怎么序列化链式结构,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概述在JavaScript中,链式模式代码,太多太多,如下:if_else:...
    99+
    2024-04-02
  • Golang中Json的序列化和反序列化的使用
    目录 JSON:创建格式:基本数据类型序列化:map序列化:切片序列化:反序列化为结构体:反序列化为map:反序列化为切片: JSON: JSON(JavaScr...
    99+
    2024-04-02
  • Django 序列化的具体使用
    目录一、简介二、使用1.基本使用2.自定义序列化字段3.连表序列化以及深度控制4.序列化字段url一、简介 django rest framework 中的序列化组件,可以说是其核...
    99+
    2024-04-02
  • 怎么使用C#实现XML序列化
    本篇内容主要讲解“怎么使用C#实现XML序列化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用C#实现XML序列化”吧!一、使用 System.Xml.Serialization类1、定义...
    99+
    2023-06-30
  • 怎么使用golang range遍历结构体数组
    你可以使用range关键字来遍历结构体数组。下面是一个简单的例子: package main import "fmt" type...
    99+
    2023-10-22
    golang
  • 使用fastjson怎么实现反序列化
    这期内容当中小编将会给大家带来有关使用fastjson怎么实现反序列化,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、fastjson反序列化就是把JSON格式的文本转化为Java Bean对象。fas...
    99+
    2023-06-14
  • golang中结构体嵌套接口的实现
    在golang中结构体A嵌套另一个结构体B见的很多,可以扩展A的能力。 A不仅拥有了B的属性,还拥有了B的方法,这里面还有一个字段提升的概念。 示例: package main i...
    99+
    2023-05-14
    golang 结构体嵌套接口 golang 嵌套接口
  • c# 如何使用结构体实现共用体
    目录理解 C 语言的共用体使用 C# 实现共用体共用体作为另一个共用体的成员在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作