encoding/gob

2024-06-11 01:08
文章标签 encoding gob

本文主要是介绍encoding/gob,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

import "encoding/gob"

gob包管理gob流——在编码器(发送器)和解码器(接受器)之间交换的binary值。一般用于传递远端程序调用(RPC)的参数和结果,如net/rpc包就有提供。

本实现给每一个数据类型都编译生成一个编解码程序,当单个编码器用于传递数据流时,会分期偿还编译的消耗,是效率最高的。

基本特点

1.gob流是自解码的
2.流中的所有数据都有前缀(采用一个预定义类型的集合)指明其类型.
3.指针不会传递,而是传递值
4.递归的类型可以很好的工作,但是递归的值(比如说值内某个成员直接/间接指向该值)会出问题。

go编解码过程

1.先要创建一个编码器
2.并向其一共一系列数据:可以是值,也可以是指向实际存在数据的指针。
3.编码器会确保所有必要的类型信息都被发送。
4.在接收端,解码器从编码数据流中恢复数据并将它们填写进本地变量里

下面写一个小实例演示一下过程

package mainimport ("bytes""encoding/gob""log""fmt"
)type User struct {Name string
}func main() {var network bytes.Buffer// 1.创建编码器enc := gob.NewEncoder(&network)// 2.向编码器中写入数据err := enc.Encode(User{Name:"酷走天涯"})if err != nil {log.Fatal(err)}// 3.创建解码器dec := gob.NewDecoder(&network)var user User// 4.解码dec.Decode(&user)fmt.Println(user.Name)
}
1594482-7694ef80d4bfada2.png
image.png

我们创建了一个编码器,将数据写入流中,然后创建了一个解码器,将数据流解码到user变量中

我们下面自定义编码的编解码过程

package mainimport ("bytes""encoding/gob""log""fmt"
)type User struct {Name string
}// 编码过程
func (v User) MarshalBinary() ([]byte, error) {var b bytes.Bufferfmt.Fprintln(&b, v.Name)return b.Bytes(), nil
}
// 自定义解码过程
func (v *User) UnmarshalBinary(data []byte) error {// A simple encoding: plain text.b := bytes.NewBuffer(data)_, err := fmt.Fscanln(b, &v.Name)return err
}func main() {var network bytes.Buffer// 1.创建编码器enc := gob.NewEncoder(&network)// 2.向编码器中写入数据err := enc.Encode(User{Name:"酷走天涯"})if err != nil {log.Fatal(err)}// 3.创建解码器dec := gob.NewDecoder(&network)var user User// 4.解码dec.Decode(&user)fmt.Println(user)
}
1594482-315df2a7c9c37fc1.png
image.png

让对象实现方法 UnmarshalBinary(data []byte) errorMarshalBinary() ([]byte, error)即可实现重写编码过程

这篇关于encoding/gob的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049784

相关文章

[LeetCode] 820. Short Encoding of Words

题:https://leetcode.com/problems/short-encoding-of-words/ 题目大意 参考题目 思路 set 集合 将所有word 放入set中,然后遍历所有set中的word,将word的从头的子串都从set中删除,最后统计 set中所有(word 的长度 + 1)(’#’) class Solution {public int minimumL

whose UTF8 encoding is longer than the max length 32766

问题描述:java.lang.IllegalArgumentException: Document contains at least one immense term in field=“cf_jg.keyword” (whose UTF8 encoding is longer than the max length 32766) 原因:设置为keyword类型的字段,插入很长的大段内容后,报

json序列化 (gob标准库)

json序列化 (gob标准库) type s struct {data map[string]interface{}} 1.json序列化 会将 int 类型,转化成float64。 func jsonDemo() {var s1 = s{data: make(map[string]interface{}, 8),}s1.data["count"] = 1ret, err := jso

自然语言处理(NLP)-子词模型(Subword Models):BPE(Byte Pair Encoding)、WordPiece、ULM(Unigram Language Model)

在NLP任务中,神经网络模型的训练和预测都需要借助词表来对句子进行表示。传统构造词表的方法,是先对各个句子进行分词,然后再统计并选出频数最高的前N个词组成词表。通常训练集中包含了大量的词汇,以英语为例,总的单词数量在17万到100万左右。出于计算效率的考虑,通常N的选取无法包含训练集中的所有词。因而,这种方法构造的词表存在着如下的问题: 实际应用中,模型预测的词汇是开放的,对于未在词表中出现的词

【位置编码】【Positional Encoding】直观理解位置编码!把位置编码想象成秒针!

【位置编码】【Positional Encoding】直观理解位置编码!把位置编码想象成秒针! 你们有没有好奇过为啥位置编码非得长成这样: P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i / d m o d e l

PHP Curl Content-Encoding: gzip乱码问题解决

笔者在使用php curl对接hugegraph的过程中,发现向gremlin发送结果返回乱码,截图如下: 对比这个请求和普通的请求:       发现返回乱码的乱码请求中有Content-Encoding: gzip,即返回的内容采用了gzip压缩,所以需要在curl请求中加入 curl_setopt($curl, CURLOPT_ENCODING, 'gzip'); 即返回正常。

什么是大模型的位置编码Position Encoding?

1. 什么是位置编码 位置编码(Positional Encoding)是一种在处理序列数据时,用于向模型提供序列中每个元素位置信息的技术。 在自然语言处理(NLP)中,尤其是在使用Transformer模型时,位置编码尤为重要,因为Transformer模型本身并不包含处理序列顺序的机制。 位置编码的主要目的是让模型能够区分输入序列中词的顺序,从而更好地理解句子的结构和含义。 2.

error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm

备注:本笔记所描述的问题的前提是机器上已安装成功git且通过配置ca证书支持以https方式获取远程仓库,如果使用git时碰到这篇文章描述的问题,那么按那篇文章给出的办法解决即可。 最近从github clone repo时,git clone命令报错如下(以vim代码补全插件youcompleteme为例): ? 1 2 3 $ git clone https:

requests请求时,遇到的Accept-Encoding问题

在使用requests请求链接的时候,发现请求得到的内容总是一堆乱码: 此时请求的headers里的Accept-Encoding是这样写的: headers = {'Accept-Encoding': 'gzip, deflate','User-Agent': str('Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Geck

gbase8s之Encoding or code set not supported

如图发生以下错误: 解决办法:在url里加上ifx_use_strenc=true 就可以了 参数解释: