Go語(yǔ)言二進(jìn)制文件的讀寫(xiě)操作
Go語(yǔ)言的二進(jìn)制(gob)格式是一個(gè)自描述的二進(jìn)制序列。從其內(nèi)部表示來(lái)看,Go語(yǔ)言的二進(jìn)制格式由一個(gè) 0 塊或者更多塊的序列組成,其中的每一塊都包含一個(gè)字節(jié)數(shù),一個(gè)由 0 個(gè)或者多個(gè) typeId-typeSpecification 對(duì)組成的序列,以及一個(gè) typeId-value 對(duì)。
如果 typeId-value 對(duì)的 typeId 是預(yù)先定義好的(例如 bool、int 和 string 等),則這些 typeId-typeSpecification 對(duì)可以省略。否則就用類(lèi)型對(duì)來(lái)描述一個(gè)自定義類(lèi)型(如一個(gè)自定義的結(jié)構(gòu)體)。類(lèi)型對(duì)和值對(duì)之間的 typeId 沒(méi)有區(qū)別。
正如我們將看到的,我們無(wú)需了解其內(nèi)部結(jié)構(gòu)就可以使用 gob 格式, 因?yàn)?encoding/gob 包會(huì)在幕后為我們打理好一切底層細(xì)節(jié)。
Go語(yǔ)言中的 encoding/gob 包也提供了與 encoding/json 包一樣的編碼解碼功能,并且容易使用。通常而言如果對(duì)肉眼可讀性不做要求,gob 格式是Go語(yǔ)言上用于文件存儲(chǔ)和網(wǎng)絡(luò)傳輸最為方便的格式。
寫(xiě)Go語(yǔ)言二進(jìn)制文件
下面通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)演示一下Go語(yǔ)言是如何生成一個(gè)二進(jìn)制文件的,代碼如下所示:
package main
import (
"encoding/gob"
"fmt"
"os"
)
func main() {
info := "http://jb51.net/golang/"
file, err := os.Create("./output.gob")
if err != nil {
fmt.Println("文件創(chuàng)建失敗", err.Error())
return
}
defer file.Close()
encoder := gob.NewEncoder(file)
err = encoder.Encode(info)
if err != nil {
fmt.Println("編碼錯(cuò)誤", err.Error())
return
} else {
fmt.Println("編碼成功")
}
}
運(yùn)行上面的代碼會(huì)在當(dāng)前目錄下生成一個(gè) output.gob 文件,文件內(nèi)容如下所示:
210c 001e 6874 7470 3a2f 2f63 2e62 6961
6e63 6865 6e67 2e6e 6574 2f67 6f6c 616e
672f
讀Go語(yǔ)言二進(jìn)制文件
讀 gob 數(shù)據(jù)和寫(xiě)一樣簡(jiǎn)單,示例代碼如下:
package main
import (
"encoding/gob"
"fmt"
"os"
)
func main() {
file, err := os.Open("./output.gob")
if err != nil {
fmt.Println("文件打開(kāi)失敗", err.Error())
return
}
defer file.Close()
decoder := gob.NewDecoder(file)
info := ""
err = decoder.Decode(&info)
if err != nil {
fmt.Println("解碼失敗", err.Error())
} else {
fmt.Println("解碼成功")
fmt.Println(info)
}
}
運(yùn)行結(jié)果如下:
go run main.go
解碼成功http://jb51.net/golang/
到此這篇關(guān)于Go語(yǔ)言二進(jìn)制文件的讀寫(xiě)操作的文章就介紹到這了,更多相關(guān)Go語(yǔ)言二進(jìn)制文件讀寫(xiě)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang如何部署到服務(wù)器及應(yīng)注意問(wèn)題解析
這篇文章主要為大家介紹了golang如何部署到服務(wù)器及應(yīng)注意問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
使用client go實(shí)現(xiàn)自定義控制器的方法
本文我們來(lái)使用client-go實(shí)現(xiàn)一個(gè)自定義控制器,通過(guò)判斷service的Annotations屬性是否包含ingress/http,如果包含則創(chuàng)建ingress,如果不包含則不創(chuàng)建,對(duì)client go自定義控制器相關(guān)知識(shí)感興趣的朋友一起看看吧2022-05-05
golang 如何用反射reflect操作結(jié)構(gòu)體
這篇文章主要介紹了golang 用反射reflect操作結(jié)構(gòu)體的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
一文帶你了解Golang中類(lèi)型轉(zhuǎn)換庫(kù)cast的使用
你是否在使用 Go 的過(guò)程中因?yàn)轭?lèi)型轉(zhuǎn)換的繁瑣而苦惱過(guò)?你是否覺(jué)得 Go 語(yǔ)言中的類(lèi)型斷言可能會(huì) panic 而對(duì)自己寫(xiě)的代碼有那么一點(diǎn)點(diǎn)不放心?本文就為大家推薦一個(gè)用于類(lèi)型轉(zhuǎn)換的第三方庫(kù) cast 絕對(duì)是一個(gè)值得嘗試的選擇2023-02-02
Go語(yǔ)言中實(shí)現(xiàn)enum枚舉的方法詳解
枚舉,即?enum,可用于表示一組范圍固定的值,它能助我們寫(xiě)出清晰、安全的代碼,那么你是否了解過(guò)?Go?中的枚舉呢?下面就跟隨小編一起來(lái)學(xué)習(xí)一下Go語(yǔ)言中實(shí)現(xiàn)enum枚舉的常用方法吧2024-02-02
Golang中omitempty關(guān)鍵字的具體實(shí)現(xiàn)
本文主要介紹了Golang中omitempty關(guān)鍵字的具體實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Go語(yǔ)言單元測(cè)試基礎(chǔ)從入門(mén)到放棄
這篇文章主要介紹了Go單元測(cè)試基礎(chǔ)從入門(mén)到放棄為大家開(kāi)啟Go語(yǔ)言單元測(cè)試第一篇章,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

