婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

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

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

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

gob是Golang包自帶的一個數據結構序列化的編碼/解碼工具。編碼使用Encoder,解碼使用Decoder。一種典型的應用場景就是RPC(remote procedure calls)。

gob和json的pack之類的方法一樣,由發送端使用Encoder對數據結構進行編碼。在接收端收到消息之后,接收端使用Decoder將序列化的數據變化成本地變量。

基本使用

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

Register和RegisterName

1、編碼的數據中有空接口類型,傳遞時賦值的空接口為:基本類型(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 //網絡傳遞的數據載體
func main() {
	err := senMsg()
	if err!=nil {
		fmt.Println("編碼錯誤")
		return
	}
	err = revMsg()
	if err!=nil {
		fmt.Println("解碼錯誤")
		return
	}
}
 
func senMsg()error {
	fmt.Print("開始執行編碼(發送端)") 
	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("原始數據:",sendMsg)
	err := enc.Encode(sendMsg)
	fmt.Println("傳遞的編碼數據為:",network)
	return  err
}
func revMsg()error {
	var revData MsgData
	dec:=gob.NewDecoder(network)
	err:= dec.Decode(revData) //傳遞參數必須為 地址
	fmt.Println("解碼之后的數據為:",revData)
	return err
}

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

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

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

正確代碼為:

interface{}的賦值為map時:

package main 
import (
	"bytes"
	"encoding/gob"
	"fmt"
)
 
type MsgData struct {
	X, Y, Z int
	Name string
	Msg interface{}
}
var network bytes.Buffer //網絡傳遞的數據載體
func main() {
	err := senMsg()
	if err!=nil {
		fmt.Println("編碼錯誤")
		return
	}
	err = revMsg()
	if err!=nil {
		fmt.Println("解碼錯誤")
		return
	}
}
 
func senMsg()error {
	fmt.Print("開始執行編碼(發送端)")
 
	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("原始數據:",sendMsg)
	err := enc.Encode(sendMsg)
	fmt.Println("傳遞的編碼數據為:",network)
	return  err
}
func revMsg()error {
	var revData MsgData
	dec:=gob.NewDecoder(network)
	err:= dec.Decode(revData) //傳遞參數必須為 地址
	fmt.Println("解碼之后的數據為:",revData)
	return err
}

interface{}的賦值為結構體時:

package main 
import (
	"bytes"
	"encoding/gob"
	"fmt"
)
 
type MsgData struct {
	X, Y, Z int
	Name    string
	Msg     interface{}
}
 
var network bytes.Buffer //網絡傳遞的數據載體
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("開始執行編碼(發送端)")
	enc := gob.NewEncoder(network)
	gob.Register(Msg{}) //TODO:進行了注冊
	s:=Msg{10001,"hello jiangzhou"}
	sendMsg := MsgData{3, 4, 5, "jiangzhou", s}
	fmt.Println("原始數據:", sendMsg)
	err := enc.Encode(sendMsg)
	fmt.Println("傳遞的編碼數據為:", network)
	return err
}
func revMsg() error {
	var revData MsgData
	dec := gob.NewDecoder(network)
	err := dec.Decode(revData) //傳遞參數必須為 地址
	fmt.Println("解碼之后的數據為:", revData)
	return err
}

注:特別注意:以上代碼中的結構體Msg對應的成員變量名稱首字母一定要大寫,不然會出現:編碼錯誤編碼錯誤 gob: type main.Msg has no exported fields

這里使用了

gob.Register(Msg{})

告訴系統:所有的Interface是有可能為Msg結構的。

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

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

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

encoding/gob包實現了高效的序列化,特別是數據結構較復雜的,結構體、數組和切片都被支持。

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

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

如果是你的結構體的字段是小寫開頭 gob序列化你的結構體的時候會找不到字段

如果我把

type Person struct {
    Age int
    Name string
}

改成

type Person struct {
    age int
    name string
}

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

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

這個錯誤還有一種可能造成的 你定義的結構里面還有一個結構 2

這個結構2的字段全部都是小寫開頭

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

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

gob在編譯的時候 如果你的這個結構體里面包含另一個結構體

但是另一個結構體的字段開頭沒有大寫

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

你反序列化的時候會發現這個字段是nil 空值

我去你碼的

今天是2019年11月4日,今天新的序列化bug出現了

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

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

其實gob是可以序列化全部結構,但是它不能序列化interface接口

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

密鑰對的中的公鑰結構體里面一個字段elliptic.Curve 他是接口

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

gob提供了一個函數可以進行注冊

gob.Register(elliptic.P256())

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

然后就解決了~

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

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

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

巨人網絡通訊聲明:本文標題《Golang Gob編碼(gob包的使用詳解)》,本文關鍵詞  Golang,Gob,編碼,gob,包,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang Gob編碼(gob包的使用詳解)》相關的同類信息!
  • 本頁收集關于Golang Gob編碼(gob包的使用詳解)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    色综合一个色综合| 2023国产精品| 久久久久久久久久久黄色| 日韩精品一区二区三区中文精品| 久久精品一区八戒影视| 亚洲一区二区三区四区中文字幕| 蜜臀av性久久久久蜜臀aⅴ流畅| 免费看日韩a级影片| 一区二区三区在线观看视频| 中文字幕一区二区三区色视频| 欧美一区二区私人影院日本| 91精品国产一区二区| 国产精品初高中害羞小美女文| 中文字幕av一区二区三区高| 欧美精品一区二区精品网| 欧美电影在哪看比较好| 欧美偷拍一区二区| 粉嫩一区二区三区在线看| 日韩av网站在线观看| 精品一区二区三区蜜桃| 亚洲成av人在线观看| 亚洲精品一二三区| 亚洲成人第一页| 91麻豆自制传媒国产之光| 欧美一区二区播放| 一色桃子久久精品亚洲| 欧美午夜精品久久久久久孕妇| 亚洲六月丁香色婷婷综合久久| 日韩成人dvd| 国产精品夜夜嗨| 日韩视频免费观看高清完整版 | www国产成人| 国产精品免费视频网站| 六月丁香婷婷久久| 经典三级视频一区| 欧美在线综合视频| 欧美精品乱码久久久久久按摩| 国产高清视频一区| 99国产一区二区三精品乱码| 中文字幕一区二区三区蜜月| 日本一区二区三级电影在线观看 | aaa欧美大片| 色999日韩国产欧美一区二区| 久久综合中文字幕| 天天综合网 天天综合色| 99久久精品国产一区二区三区| 日韩一区二区精品葵司在线| 久久精品国产99国产| 91麻豆精品国产自产在线观看一区| 五月婷婷欧美视频| 成人福利视频网站| 午夜激情一区二区三区| 久久久久久久久久久久电影 | 久久久www成人免费无遮挡大片| 国产+成+人+亚洲欧洲自线| 欧美成人aa大片| 久久久久久99久久久精品网站| 国产成人精品午夜视频免费| 国产精品久久久久影院| 欧美亚洲一区二区在线| 国产91露脸合集magnet| 亚洲欧美日韩一区| 95精品视频在线| 中文字幕精品—区二区四季| 亚洲精品视频自拍| 色狠狠综合天天综合综合| 亚洲精品视频在线看| av福利精品导航| 美腿丝袜亚洲三区| 97se亚洲国产综合自在线不卡 | 国产成人精品影院| 精品成人一区二区| 免费成人av在线播放| 欧美嫩在线观看| 亚洲成人手机在线| 欧美日韩国产首页在线观看| 免费观看日韩av| 首页欧美精品中文字幕| 亚洲一区在线看| 国产欧美视频在线观看| 久久久国产精品不卡| 一区二区三区精品在线观看| 五月天中文字幕一区二区| 成人欧美一区二区三区白人 | 在线一区二区三区四区五区 | 欧美α欧美αv大片| 美女网站色91| 国产麻豆视频精品| 亚洲免费看黄网站| 亚洲天堂久久久久久久| 亚洲男人天堂av| 国产蜜臀av在线一区二区三区| 亚洲国产精品传媒在线观看| 精品少妇一区二区| 亚洲激情一二三区| 亚洲一二三级电影| 九九九久久久精品| 在线成人午夜影院| 欧美一卡二卡三卡| 亚洲综合一区二区三区| 亚洲欧美日韩国产成人精品影院 | 亚洲国产精品视频| 国产自产高清不卡| 国产一区福利在线| 99精品视频在线免费观看| 91丨porny丨首页| 欧美福利一区二区| 国产欧美一区二区精品性色| 亚洲一区视频在线| 亚洲精品成人悠悠色影视| 国产夫妻精品视频| 26uuu国产在线精品一区二区| 国内精品国产三级国产a久久| 中文字幕一区二区5566日韩| 奇米四色…亚洲| 日韩欧美激情在线| 国产精品亚洲视频| 日韩中文字幕不卡| 亚洲国产乱码最新视频| 99久久免费国产| 中文字幕一区二区三区av| 久久成人免费网站| 久久久亚洲国产美女国产盗摄| 青青草91视频| 欧美性高清videossexo| 亚洲www啪成人一区二区麻豆| 国产亚洲精品aa| 国产精品福利影院| 日韩一级片在线观看| 日韩精品最新网址| 亚洲欧美激情在线| 美女久久久精品| 手机精品视频在线观看| 亚洲欧美日韩国产综合| 午夜欧美一区二区三区在线播放| 日韩美女主播在线视频一区二区三区| 亚洲欧美色综合| 91久久免费观看| 日精品一区二区三区| 精品国产污网站| 91丨九色丨黑人外教| 樱花草国产18久久久久| 欧美精品黑人性xxxx| 一本高清dvd不卡在线观看| 激情六月婷婷久久| 中文字幕五月欧美| 欧美视频一区二区三区| 蜜桃视频在线观看一区| 日韩欧美www| 免播放器亚洲一区| 欧美午夜一区二区三区| 日韩中文字幕av电影| 欧美放荡的少妇| 亚洲无人区一区| 欧美视频在线一区二区三区 | 国产精一品亚洲二区在线视频| 亚洲午夜电影网| 国产一区不卡在线| 一区二区三区精品久久久| 中文字幕第一页久久| a级高清视频欧美日韩| 一区二区三区91| 日韩欧美一级二级| 欧美群妇大交群的观看方式| 日本福利一区二区| 成人免费精品视频| 欧美日韩国产一区二区三区地区| www日韩大片| 久久嫩草精品久久久精品| 成人午夜视频在线观看| 中文在线一区二区| 日韩中文字幕亚洲一区二区va在线 | 国产精品色哟哟| 精品国产污网站| 亚洲国产成人av| 91精品国产丝袜白色高跟鞋| 国产成人精品免费视频网站| 肉丝袜脚交视频一区二区| 国产一本一道久久香蕉| 国产剧情一区二区| 国产不卡免费视频| 在线观看亚洲a| 国产日韩av一区二区| 欧美色综合久久| 久久精品视频免费观看| 亚洲天堂网中文字| 久久国产夜色精品鲁鲁99| 99久久婷婷国产综合精品电影 | 欧美视频一区二区三区| 亚洲一区在线播放| 一区二区免费在线播放| 亚洲免费观看高清完整版在线观看熊| 中文字幕一区在线观看| 国产欧美视频一区二区三区| 日本欧美肥老太交大片| 欧美高清性hdvideosex| 亚欧色一区w666天堂| 成人av在线观| 69久久夜色精品国产69蝌蚪网| 欧洲人成人精品|