成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Golang Gob編碼(gob包的使用詳解)

Golang Gob編碼(gob包的使用詳解)

熱門標簽:excel地圖標注分布數(shù)據(jù) 阿克蘇地圖標注 壽光微信地圖標注 評價高的400電話辦理 百度地圖標注后傳給手機 外呼系統(tǒng)顯本地手機號 涿州代理外呼系統(tǒng) 外呼系統(tǒng)用什么卡 電話機器人軟件免費

gob是Golang包自帶的一個數(shù)據(jù)結(jié)構(gòu)序列化的編碼/解碼工具。編碼使用Encoder,解碼使用Decoder。一種典型的應(yīng)用場景就是RPC(remote procedure calls)。

gob和json的pack之類的方法一樣,由發(fā)送端使用Encoder對數(shù)據(jù)結(jié)構(gòu)進行編碼。在接收端收到消息之后,接收端使用Decoder將序列化的數(shù)據(jù)變化成本地變量。

基本使用

package main 
import (
	"bytes"
	"encoding/gob"
	"fmt"
)
 
type MsgData struct {
	X, Y, Z int
	Name string
}
var network bytes.Buffer //網(wǎng)絡(luò)傳遞的數(shù)據(jù)載體
func main() {
	err := senMsg()
	if err!=nil {
		fmt.Println("編碼錯誤")
		return
	}
	err = revMsg()
	if err!=nil {
		fmt.Println("解碼錯誤")
		return
	}
}
 
func senMsg()error {
	fmt.Print("開始執(zhí)行編碼(發(fā)送端)")
 
	enc := gob.NewEncoder(network)
	sendMsg:=MsgData{3, 4, 5, "jiangzhou"}
	fmt.Println("原始數(shù)據(jù):",sendMsg)
	err := enc.Encode(sendMsg)
	fmt.Println("傳遞的編碼數(shù)據(jù)為:",network)
	return  err
}
func revMsg()error {
	var revData MsgData
	dec:=gob.NewDecoder(network)
	err:= dec.Decode(revData) //傳遞參數(shù)必須為 地址
	fmt.Println("解碼之后的數(shù)據(jù)為:",revData)
	return err
}

Register和RegisterName

1、編碼的數(shù)據(jù)中有空接口類型,傳遞時賦值的空接口為:基本類型(int、float、string)、切片時,可以不進行注冊。

package main 
import (
	"bytes"
	"encoding/gob"
	"fmt"
)
 
type MsgData struct {
	X, Y, Z int
	Name string
	Msg interface{}
}
var network bytes.Buffer //網(wǎng)絡(luò)傳遞的數(shù)據(jù)載體
func main() {
	err := senMsg()
	if err!=nil {
		fmt.Println("編碼錯誤")
		return
	}
	err = revMsg()
	if err!=nil {
		fmt.Println("解碼錯誤")
		return
	}
}
 
func senMsg()error {
	fmt.Print("開始執(zhí)行編碼(發(fā)送端)") 
	enc := gob.NewEncoder(network) 
	s:=make([]string,0)
	s=append(s, "hello")
	//sendMsg:=MsgData{3, 4, 5, "jiangzhou",Msg{10001,"hello"}}
	//sendMsg:=MsgData{3, 4, 5, "jiangzhou",66.66}
	sendMsg:=MsgData{3, 4, 5, "jiangzhou",s}
	fmt.Println("原始數(shù)據(jù):",sendMsg)
	err := enc.Encode(sendMsg)
	fmt.Println("傳遞的編碼數(shù)據(jù)為:",network)
	return  err
}
func revMsg()error {
	var revData MsgData
	dec:=gob.NewDecoder(network)
	err:= dec.Decode(revData) //傳遞參數(shù)必須為 地址
	fmt.Println("解碼之后的數(shù)據(jù)為:",revData)
	return err
}

編碼的數(shù)據(jù)中有空接口類型,傳遞時賦值的空接口為:map、struct時,必須進行注冊。

package main 
import (
	"bytes"
	"encoding/gob"
	"fmt"
)
 
type MsgData struct {
	X, Y, Z int
	Name string
	Msg interface{}
}
var network bytes.Buffer //網(wǎng)絡(luò)傳遞的數(shù)據(jù)載體
func main() {
	err := senMsg()
	if err!=nil {
		fmt.Println("編碼錯誤")
		return
	}
	err = revMsg()
	if err!=nil {
		fmt.Println("解碼錯誤")
		return
	}
}
 
func senMsg()error {
	fmt.Print("開始執(zhí)行編碼(發(fā)送端)")
 
	enc := gob.NewEncoder(network)
 
   m:=make(map[int]string)
	m[10001]="hello"
	m[10002]="jiangzhou"
	sendMsg:=MsgData{3, 4, 5, "jiangzhou",m}
	fmt.Println("原始數(shù)據(jù):",sendMsg)
	err := enc.Encode(sendMsg)
	fmt.Println("傳遞的編碼數(shù)據(jù)為:",network)
	return  err
}
func revMsg()error {
	var revData MsgData
	dec:=gob.NewDecoder(network)
	err:= dec.Decode(revData) //傳遞參數(shù)必須為 地址
	fmt.Println("解碼之后的數(shù)據(jù)為:",revData)
	return err
}

Register和RegisterName解決的主要問題是:當編解碼中有一個字段是interface{}(interface{}的賦值為map、結(jié)構(gòu)體時)的時候需要對interface{}的可能產(chǎn)生的類型進行注冊。

正確代碼為:

interface{}的賦值為map時:

package main 
import (
	"bytes"
	"encoding/gob"
	"fmt"
)
 
type MsgData struct {
	X, Y, Z int
	Name string
	Msg interface{}
}
var network bytes.Buffer //網(wǎng)絡(luò)傳遞的數(shù)據(jù)載體
func main() {
	err := senMsg()
	if err!=nil {
		fmt.Println("編碼錯誤")
		return
	}
	err = revMsg()
	if err!=nil {
		fmt.Println("解碼錯誤")
		return
	}
}
 
func senMsg()error {
	fmt.Print("開始執(zhí)行編碼(發(fā)送端)")
 
	enc := gob.NewEncoder(network)
 
   m:=make(map[int]string)
	m[10001]="hello"
	m[10002]="jiangzhou"
	gob.Register(map[int]string{}) //TODO:進行了注冊
	sendMsg:=MsgData{3, 4, 5, "jiangzhou",m}
	fmt.Println("原始數(shù)據(jù):",sendMsg)
	err := enc.Encode(sendMsg)
	fmt.Println("傳遞的編碼數(shù)據(jù)為:",network)
	return  err
}
func revMsg()error {
	var revData MsgData
	dec:=gob.NewDecoder(network)
	err:= dec.Decode(revData) //傳遞參數(shù)必須為 地址
	fmt.Println("解碼之后的數(shù)據(jù)為:",revData)
	return err
}

interface{}的賦值為結(jié)構(gòu)體時:

package main 
import (
	"bytes"
	"encoding/gob"
	"fmt"
)
 
type MsgData struct {
	X, Y, Z int
	Name    string
	Msg     interface{}
}
 
var network bytes.Buffer //網(wǎng)絡(luò)傳遞的數(shù)據(jù)載體
func main() {
	err := senMsg()
	if err != nil {
		fmt.Println("編碼錯誤",err)
		return
	}
	err = revMsg()
	if err != nil {
		fmt.Println("解碼錯誤")
		return
	}
}
 
type Msg struct {
	Id     int
	Detail string
}
 
func senMsg() error {
	fmt.Print("開始執(zhí)行編碼(發(fā)送端)")
	enc := gob.NewEncoder(network)
	gob.Register(Msg{}) //TODO:進行了注冊
	s:=Msg{10001,"hello jiangzhou"}
	sendMsg := MsgData{3, 4, 5, "jiangzhou", s}
	fmt.Println("原始數(shù)據(jù):", sendMsg)
	err := enc.Encode(sendMsg)
	fmt.Println("傳遞的編碼數(shù)據(jù)為:", network)
	return err
}
func revMsg() error {
	var revData MsgData
	dec := gob.NewDecoder(network)
	err := dec.Decode(revData) //傳遞參數(shù)必須為 地址
	fmt.Println("解碼之后的數(shù)據(jù)為:", revData)
	return err
}

注:特別注意:以上代碼中的結(jié)構(gòu)體Msg對應(yīng)的成員變量名稱首字母一定要大寫,不然會出現(xiàn):編碼錯誤編碼錯誤 gob: type main.Msg has no exported fields

這里使用了

gob.Register(Msg{})

告訴系統(tǒng):所有的Interface是有可能為Msg結(jié)構(gòu)的。

在這個例子中,如果你注釋了gob.Register, 系統(tǒng)會報錯。

RegisterName是和Register一樣的效果,只是在Register的同時也為這個類型附上一個別名。

補充:GO語音gob包的系列化和反序列化使用和遇到的錯誤

encoding/gob包實現(xiàn)了高效的序列化,特別是數(shù)據(jù)結(jié)構(gòu)較復(fù)雜的,結(jié)構(gòu)體、數(shù)組和切片都被支持。

package main
 
import (
 "bytes"
 "encoding/gob"
 "fmt"
)
//定義一個結(jié)構(gòu)體
type Person struct {
 Age int
 Name string
}
 
func main() {
 p1:=Person{
  Age:  18,
  Name: "貪吃的豬",
 }
 //序列化
 //這里是儲存的buffer
 var bufferr bytes.Buffer
 PerEncod:=gob.NewEncoder(bufferr) //1.創(chuàng)建一個編碼器
 err:=PerEncod.Encode(p1) //編碼
 if err != nil {
  fmt.Println("編碼器 解碼錯誤",err)
  return
 }
 //現(xiàn)在buffer就是完成儲存序列化的
 fmt.Printf("序列化:buf%x\n",bufferr)
 
 //創(chuàng)建一個空的結(jié)構(gòu)體來接受
 p2 :=Person{}
 //反序列化
 PerDecod:=gob.NewDecoder(bytes.NewReader(bufferr.Bytes()))//創(chuàng)建一個反編碼器
 err=PerDecod.Decode(p2)
 if err != nil {
  fmt.Println("PerDecod.Decode err:",err)
  return
 }
 fmt.Println("反序列化:",p2)
 //fmt.Printf("反序列化數(shù)據(jù):string",p2)
}

系列化和反系列化的常見的錯誤

如果是你的結(jié)構(gòu)體的字段是小寫開頭 gob序列化你的結(jié)構(gòu)體的時候會找不到字段

如果我把

type Person struct {
    Age int
    Name string
}

改成

type Person struct {
    age int
    name string
}

編碼器 解碼錯誤 gob: type main.Person has no exported fields

解決方法就是把字段開頭變成大寫

這個錯誤還有一種可能造成的 你定義的結(jié)構(gòu)里面還有一個結(jié)構(gòu) 2

這個結(jié)構(gòu)2的字段全部都是小寫開頭

解決方法就是把字段開頭變成大寫

今天是2019年11月2日 11:32 我的一個改了半天的bug 終于解決

gob在編譯的時候 如果你的這個結(jié)構(gòu)體里面包含另一個結(jié)構(gòu)體

但是另一個結(jié)構(gòu)體的字段開頭沒有大寫

gob編譯的時候是不會報錯,他會不要沒有大寫的字段,

你反序列化的時候會發(fā)現(xiàn)這個字段是nil 空值

我去你碼的

今天是2019年11月4日,今天新的序列化bug出現(xiàn)了

我生成秘鑰對然后對密鑰對進行數(shù)據(jù)序列化然后儲存在文件里面

然后錯誤提示,在, gob: type not registered for interface: elliptic.p256Curve

其實gob是可以序列化全部結(jié)構(gòu),但是它不能序列化interface接口

因為接口的大小是無法定義的

密鑰對的中的公鑰結(jié)構(gòu)體里面一個字段elliptic.Curve 他是接口

我們把這個接口進行注冊就行了

gob提供了一個函數(shù)可以進行注冊

gob.Register(elliptic.P256())

要gob遇到這個接口的時候按照elliptic.P256格式進行編譯

然后就解決了~

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 基于golang uint8、int8與byte的區(qū)別說明
  • golang 監(jiān)聽服務(wù)的信號,實現(xiàn)平滑啟動,linux信號說明詳解
  • golang 實現(xiàn)時間戳和時間的轉(zhuǎn)化
  • golang如何獲得一個變量的類型
  • golang 如何獲取文件夾下面的文件列表
  • golang 如何實現(xiàn)HTTP代理和反向代理
  • Golang實現(xiàn)http文件上傳小功能的案例
  • golang值類型轉(zhuǎn)換成[]uint8類型的操作

標簽:汕頭 雞西 重慶 蘭州 吐魯番 銅川 欽州 梅河口

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Golang Gob編碼(gob包的使用詳解)》,本文關(guān)鍵詞  Golang,Gob,編碼,gob,包,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang Gob編碼(gob包的使用詳解)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Golang Gob編碼(gob包的使用詳解)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产v片在线观看| 91网站免费入口| 麻豆国产精品va在线观看不卡| 国产在线精品观看| 欧美乱妇40p| 麻豆一区二区99久久久久| 午夜天堂在线观看| 欧美日韩午夜激情| 国产精品欧美激情在线观看| 国产呦小j女精品视频| 在线观看亚洲一区| 青青草观看免费视频在线| 日本韩国在线观看| 国产精品99导航| 亚洲成人福利视频| 日本三级电影免费观看| 特级西西人体4444xxxx| 色一情一乱一伦一区二区三欧美| 99久久伊人精品影院| 污视频网站免费看| 天堂av2024| 久久免费精品日本久久中文字幕| 在线电影av| 性欧美xxxx免费岛国不卡电影| 蜜臀av一区二区三区有限公司| 欧美r级电影在线观看| 在线观看日本视频| 91精品国产福利在线观看| 欧美成a人免费观看久久| 亚洲国产综合视频在线观看| 日韩女优一区二区| 在线播放av网站| 成人精品视频一区二区三区| 国产福利片在线| 女人色偷偷aa久久天堂| 日本三级电影网站| 在线免费视频一区| 国产精品日本| 国产精品精华液网站| 亚洲成人av一区二区| 91小视频免费观看| 午夜久久福利| 中文字幕中文字幕在线中一区高清| 成人xvideos免费视频| 日本熟伦人妇xxxx| 欧美自拍第一页| 五月婷婷激情综合网| 怡红院av一区二区三区| 欧美成人精品三级网站| 欧美日韩伦理一区二区| 国产欧美精品在线播放| 五月婷婷一区二区三区| 成人免费视频国产在线观看| 欧美性猛交视频| 欧美成人精品欧美一| 日韩中文字幕亚洲精品欧美| 国产原创精品| 色婷婷成人在线| 成人午夜激情视频| 99re6在线观看| av亚洲免费| avhd101老司机| 精品国产免费观看一区| 97人妻精品一区二区免费| 果冻天美麻豆一区二区国产| 九九热久久免费视频| 国产模特av私拍大尺度| 人人精品人人爱| 超碰91在线| 91麻豆精品国产91久久| 三级在线视频观看| 亚洲色图另类小说| 91精品免费视频| eeuss中文字幕| 亚洲综合视频网站| 日韩中文字幕国产精品| 免费97视频在线精品国自产拍| 色一情一乱一伦一区二区三区丨| 一区二区视频| 亚洲一级电影视频| 亚洲国产私拍精品国模在线观看| 99国产精品视频免费观看一公开| 欧洲伦理片一区 二区 三区| 91精品久久久久久久久| 天天久久综合| 亚洲高清资源| 福利片在线一区二区| 欧洲vs亚洲vs国产| 久久久精品国产sm调教| 国产麻豆免费观看| 先锋资源中文在线| 国产高清成人在线| 国产99999| 99视频在线视频| 亚洲精品www.| 亚洲av无码成人精品区| 高清在线观看日韩| 亚洲精品黑牛一区二区三区| 宅男噜噜噜66一区二区| 九九热精彩视频| 自拍偷拍欧美视频| 区日韩二区欧美三区| 宅男视频免费在线观看视频| 亚洲高清在线观看| 99色在线视频| 国产成+人+综合+亚洲欧美丁香花| av中文字幕免费在线观看| 亚洲色图图片区| 国产欧美精品国产国产专区| 无遮挡又色又刺激的女人视频| 综合视频一区| 成人做爰视频网站| 国产精品无码2021在线观看| 2019国产精品自在线拍国产不卡| 国产成人精品一区二区免费看京| 日韩精品在线观看一区二区| 国产精品二区不卡| 国产成人精品一区二区三区网站观看| 中文字幕1234区| 成人在线视频网址| 欧美色欧美亚洲另类二区| 色婷婷av777| 精品视频免费在线观看| 一线天粉嫩在线播放| 国产亚洲色婷婷久久99精品| 三叶草欧洲码在线| 成人一区二区在线观看| 99热在线观看免费精品| 久久er99热精品一区二区三区| 一个人看的日本www的免费视频| 欧美午夜大胆人体| 国产另类ts人妖一区二区| 亚洲欧美日韩直播| 日韩视频免费| 亚洲国产综合人成综合网站| 国产精品日韩成人| www.久久国产| 性无码专区无码| 亚洲 欧洲 日韩| 污导航在线观看| 夜夜春很很躁夜夜躁| 日韩在线一二三| 正在播放久久| 欧美人妖在线观看| 国产婷婷视频在线| 久久久久久12| 国产区一区二区三区| 视频一区二区精品| 99久久精品免费观看| 九九九免费视频| 国内成人自拍视频| 久久三级视频| av噜噜色噜噜久久| 成人97精品毛片免费看| 一级黄色免费看| 国产成年人免费视频| 国产精品视频一区二区三区,| 国内精品久久久久| 日韩 欧美 自拍| 日本美女高清在线观看免费| 7777精品视频| 成人免费视频91| 精品视频9999| 国产91热爆ts人妖在线| 国产麻豆剧传媒精品国产| 91香蕉视频免费看| 在线观看色视频| av电影在线观看网站| 日韩国产精品一区二区三区| 四虎4hu影库永久地址| 亚洲精品一区二区三区影院忠贞| 青青视频免费在线观看| 亚洲精品日韩久久久| 黄色福利在线观看| 任你躁在线精品免费| 久久噜噜色综合一区二区| 亚洲一级黄色| 黄色成人羞羞视频| 男人的天堂在线| 亚洲青色在线| 亚洲欧美日韩在线播放| 国产原创av在线| 在线视频日韩精品| 欧美va久久久噜噜噜久久| 国产午夜精品一区理论片飘花| 超碰国产精品一区二页| 91丨九色丨蝌蚪丨老板| www.日韩大片| 天天操天天舔天天干| 日韩高清中文字幕一区| 久久精品2019中文字幕| 一区二区欧美在线| 日本a级片在线观看| 亚洲不卡一区二区三区| 97精品国产97久久久久久| 91最新网站| 欧美日本在线看| 欧美日韩亚洲一区二区三区四区| 国产精品suv一区二区88| 欧美日韩国产观看视频| 亚洲免费成人在线| 色综合久久悠悠| 日韩激情一区二区| 欧洲一级精品| 九九热r在线视频精品| 亚洲国产日韩欧美在线99| 亚洲三级免费观看| 国产午夜在线观看| 欧美深夜视频| 精品午夜视频| 国产精品高清在线观看| 精品国产一区二区三区免费| 日本成人不卡| 欧美在线中文字幕| 国产精品作爱| 国产又粗又硬视频| 国精产品一品二品国精品69xx| 国产精品护士白丝一区av| 在线视频亚洲色图| 成人免费淫片免费观看| 久久综合欧美| 亚洲黄色免费网站| 免费一区二区三区四区| 国产精品视频专区| 国产成a人亚洲精v品在线观看| 国产chinasex对白videos麻豆| 日本一区二区三区久久久久久久久不| 国产成人一区二区三区影院| 精品一区在线观看视频| xx欧美撒尿嘘撒尿xx| 国产性生交xxxxx免费| 久久久亚洲国产精品| 亚洲精品手机在线观看| 久久久久久久久99精品| 国产成人一区三区| 全球中文成人在线| 久久精品一级| 波多野结衣av一区二区全免费观看| 国产亚洲欧美一级| 麻豆成人av在线| 99re免费视频精品全部| av中文一区| 99久久人妻无码中文字幕系列| 性欧美1819sex性高清| 国产a免费视频| 小早川怜子久久精品中文字幕| 免费成人高清在线视频theav| 国产精品1000部啪视频| 麻豆一区二区三区精品视频| 日韩午夜视频在线观看| 久久99精品久久久久久水蜜桃| 欧美偷窥清纯综合图区| 成人国产精品视频| 美国成人毛片| 最新中文字幕亚洲| 男女羞羞在线观看| jizz性欧美2| 麻豆视频久久| 亚洲欧美综合视频| 99国产精品久久久久久| 国产视频一区二区在线观看| 日韩乱码一区二区三区| 欧美激情视频在线观看| 色诱色偷偷久久综合| 欧美伦理一区二区| 揉丰满老妇老女人的毛片| 色婷婷av一区二区三区大白胸| 亚洲视频在线免费播放| 男女羞羞网站| 成人免费一区二区三区视频| 国产精品爽黄69天堂a| 亚洲精品中文字幕成人片| 亚洲激精日韩激精欧美精品| 99精品视频免费版的特色功能| 蜜芽tv福利在线视频| 久久99国产精品久久99果冻传媒| 四虎在线视频| 国产精品自产拍在线观看2019| 中出福利视频| 日韩美女视频在线观看| 一区二区三区日韩视频| 蜜桃久久av| 日本国产在线播放| 久久av免费| 久久精品国产成人精品| www.久久久久久久久久| 九九九九热精品免费视频| 国产青青在线视频| 麻豆91免费| 欧美乱偷一区二区三区在线| 日本成人小视频| 精品国产91乱高清在线观看| 色婷婷精品久久二区二区蜜臀av| 91啪国产在线| 少妇饥渴放荡91麻豆| 亚洲精品偷拍| 麻豆成人在线看| 欧美激情视频免费看| 精品成人自拍视频| 欧美日韩中文字幕一区二区| 亚洲色图视频在线观看| 天天爱天天操天天干| 超碰成人在线观看| 国产亚洲一区二区精品| 精品成人无码久久久久久| 最近2019中文字幕第三页视频| 日av在线播放中文不卡| 欧洲亚洲精品| 香蕉视频在线观看免费| 久久国产精品毛片| 日韩极品少妇| 国产影视精品一区二区三区| 91亚洲天堂| 免费在线一级片| 国产成人精品a视频一区| av在线你懂的| 在线观看欧美日韩电影| 欧美激情1区2区3区| 欧美一级淫片aaaaaa| 精品二区视频| 久久色在线视频| 亚洲欧美另类久久久精品2019| 蜜桃传媒在线| 奇米影视7777精品一区二区| 超碰在线免费97| 国产a级黄色大片| 国产精品香蕉视屏| 欧美亚洲免费高清在线观看|