Golang讀寫二進(jìn)制文件方法總結(jié)
使用 Golang 的 encoding/gob 包讀寫二進(jìn)制文件非常方便,而且代碼量也非常少。但是在需要自定義二進(jìn)制格式(自定義二進(jìn)制格式有可能做到更緊湊的數(shù)據(jù)表示和更快的讀寫速度)的場(chǎng)景下,這個(gè)包就不適用了,這時(shí)候就需要使用到 encoding/binary 包了。
encoding/binary 包實(shí)現(xiàn)了數(shù)字(number)和字節(jié)序列(byte sequences)之間的簡(jiǎn)單轉(zhuǎn)換以及 varints 的編碼和解碼,varints 是一種使用一個(gè)或多個(gè)字節(jié)表示整型數(shù)據(jù)的方法,其中數(shù)值本身越小,其所占用的字節(jié)數(shù)越少。
接下來(lái)演示一下序列化數(shù)據(jù)后保存到本地,再反序列化本地的數(shù)據(jù)。
序列化數(shù)據(jù)后保存到本地
package main
import (
"bytes"
"encoding/binary"
"fmt"
"os"
)
type User struct {
Age int32
}
funcmain() {
file, err := os.Create("bin")
if err != nil {
fmt.Println("文件創(chuàng)建失敗 ", err.Error())
return
}
defer file.Close()
for i := 1; i <= 10; i++ {
data := User{
int32(i),
}
var buf bytes.Buffer
binary.Write(&buf, binary.LittleEndian, data)
b := buf.Bytes()
_, err = file.Write(b)
if err != nil {
fmt.Println("寫入失敗", err.Error())
return
}
}
fmt.Println("序列化成功")
}反序列化本地的數(shù)據(jù)
package main
import (
"bytes"
"encoding/binary"
"fmt"
"os"
)
type User struct {
Age int32
}
funcmain() {
file, err := os.Open("bin")
if err != nil {
fmt.Println("文件打開失敗 ", err.Error())
return
}
defer file.Close()
data := User{}
for i := 1; i <= 10; i++ {
b := make([]byte, 4)
_, err = file.Read(b)
if err != nil {
fmt.Println("反序列化失敗", err)
}
buffer := bytes.NewBuffer(b)
err = binary.Read(buffer, binary.LittleEndian, &data)
if err != nil {
fmt.Println("二進(jìn)制文件讀取失敗", err)
return
}
fmt.Println("第", i, "個(gè)值為:", data)
}
}更多關(guān)于 encoding/binary 的內(nèi)容請(qǐng)參考此包的源代碼。
補(bǔ)充
除了上文的方法,下面小編還為大家整理了encoding/gob 包讀寫二進(jìn)制文件的其他方法
gob是Golang自帶的一個(gè)數(shù)據(jù)結(jié)構(gòu)序列化的編碼/解碼工具,和JSON、XML、Google 的 protocol buffers類似。gob編碼使用Encoder,解碼使用Decoder。一種典型的應(yīng)用場(chǎng)景就是RPC(remote procedure calls)。
接下來(lái)演示一下序列化數(shù)據(jù)后保存到本地,再反序列化本地的數(shù)據(jù)。
序列化數(shù)據(jù)后保存到本地
package main
import (
"encoding/gob"
"fmt"
"os"
)
func main() {
data := "測(cè)試讀寫二進(jìn)制文件"
file, err := os.Create("bin") // 創(chuàng)建文件
if err != nil {
fmt.Println("文件創(chuàng)建失敗", err.Error())
return
}
defer file.Close()
encoder := gob.NewEncoder(file)
err = encoder.Encode(data)
if err != nil {
fmt.Println("編碼錯(cuò)誤", err.Error())
return
}
}反序列化本地的數(shù)據(jù)
package main
import (
"encoding/gob"
"fmt"
"os"
)
func main() {
file, err := os.Open("bin")
if err != nil {
fmt.Println("文件打開失敗", err.Error())
return
}
defer file.Close()
decoder := gob.NewDecoder(file)
var data string
err = decoder.Decode(&data)
if err != nil {
fmt.Println("解碼失敗", err.Error())
return
}
fmt.Println(data)
}到此這篇關(guān)于Golang讀寫二進(jìn)制文件方法總結(jié)的文章就介紹到這了,更多相關(guān)Golang讀寫二進(jìn)制文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang 字符串轉(zhuǎn)time類型實(shí)現(xiàn)
本文主要介紹了Golang 字符串轉(zhuǎn)time類型實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
總結(jié)Go語(yǔ)言中defer的使用和注意要點(diǎn)
Go語(yǔ)言中的defer關(guān)鍵字實(shí)現(xiàn)比較特殊的功能,這篇文章給大家總結(jié)了關(guān)于Go語(yǔ)言中defer的使用和注意要點(diǎn),有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-09-09
golang中定時(shí)器cpu使用率高的現(xiàn)象詳析
這篇文章主要給大家介紹了關(guān)于golang中定時(shí)器cpu使用率高的現(xiàn)象的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
使用Go實(shí)現(xiàn)TLS服務(wù)器和客戶端的示例
本文主要介紹了Go實(shí)現(xiàn)TLS服務(wù)器和客戶端的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
源碼分析Go語(yǔ)言使用cgo導(dǎo)致線程增長(zhǎng)的原因
這篇文章主要從一個(gè)cgo調(diào)用開始解析Go語(yǔ)言源碼,從而分析一下造成線程增長(zhǎng)的原因,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一學(xué)習(xí)一下2023-06-06
GoLang中的iface?和?eface?的區(qū)別解析
iface 和 eface 都是 Go 中描述接口的底層結(jié)構(gòu)體,區(qū)別在于 iface 描述的接口包含方法,而 eface 則是不包含任何方法的空接口:interface{},這篇文章主要介紹了GoLang之iface?和?eface?的區(qū)別,需要的朋友可以參考下2022-09-09

