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ù)越少。
接下來演示一下序列化數(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)。
接下來演示一下序列化數(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)文章
Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP
這篇文章主要為大家介紹了Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Go類型斷言提取測(cè)試接口值動(dòng)態(tài)類型及靜態(tài)轉(zhuǎn)換確保類型接口編譯安全
這篇文章主要為大家介紹了Go類型斷言提取測(cè)試接口值動(dòng)態(tài)類型及靜態(tài)轉(zhuǎn)換確保類型實(shí)現(xiàn)特定接口的編譯時(shí)安全性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Golang服務(wù)的請(qǐng)求調(diào)度的實(shí)現(xiàn)
Golang服務(wù)請(qǐng)求調(diào)度是一種使用Go語(yǔ)言實(shí)現(xiàn)的服務(wù)請(qǐng)求管理方法,本文主要介紹了Golang服務(wù)的請(qǐng)求調(diào)度的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
基于Go+OpenCV實(shí)現(xiàn)人臉識(shí)別功能的詳細(xì)示例
OpenCV是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺庫(kù),提供了豐富的圖像處理和計(jì)算機(jī)視覺算法,本文將向你介紹在Mac上安裝OpenCV的步驟,并演示如何使用Go的OpenCV綁定庫(kù)進(jìn)行人臉識(shí)別,需要的朋友可以參考下2023-07-07
源碼剖析Golang中singleflight的應(yīng)用
這篇文章主要為大家詳細(xì)介紹了如何利用singleflight來避免緩存擊穿,并剖析singleflight包的源碼實(shí)現(xiàn)和工作原理,感興趣的可以了解下2024-03-03
使用Go語(yǔ)言開發(fā)一個(gè)高并發(fā)系統(tǒng)
高并發(fā)系統(tǒng)是指能同時(shí)支持眾多用戶請(qǐng)求,處理大量并行計(jì)算的系統(tǒng),這篇文章主要為大家詳細(xì)介紹了如何使用Go語(yǔ)言開發(fā)一個(gè)高并發(fā)系統(tǒng),感興趣的小伙伴可以了解下2023-11-11
golang中g(shù)in框架接入jwt使用token驗(yàn)證身份
本文主要介紹了golang中g(shù)in框架接入jwt使用token驗(yàn)證身份,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12

