Golang讀寫(xiě)二進(jìn)制文件方法總結(jié)
使用 Golang 的 encoding/gob 包讀寫(xiě)二進(jìn)制文件非常方便,而且代碼量也非常少。但是在需要自定義二進(jìn)制格式(自定義二進(jìn)制格式有可能做到更緊湊的數(shù)據(jù)表示和更快的讀寫(xiě)速度)的場(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("寫(xiě)入失敗", 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("文件打開(kāi)失敗 ", 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 包讀寫(xiě)二進(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è)試讀寫(xiě)二進(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("文件打開(kāi)失敗", 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讀寫(xiě)二進(jìn)制文件方法總結(jié)的文章就介紹到這了,更多相關(guān)Golang讀寫(xiě)二進(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),文中通過(guò)示例代碼介紹的非常詳細(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-09golang中定時(shí)器cpu使用率高的現(xiàn)象詳析
這篇文章主要給大家介紹了關(guān)于golang中定時(shí)器cpu使用率高的現(xiàn)象的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(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ù)器和客戶端的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12源碼分析Go語(yǔ)言使用cgo導(dǎo)致線程增長(zhǎng)的原因
這篇文章主要從一個(gè)cgo調(diào)用開(kāi)始解析Go語(yǔ)言源碼,從而分析一下造成線程增長(zhǎng)的原因,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一學(xué)習(xí)一下2023-06-06GoLang中的iface?和?eface?的區(qū)別解析
iface 和 eface 都是 Go 中描述接口的底層結(jié)構(gòu)體,區(qū)別在于 iface 描述的接口包含方法,而 eface 則是不包含任何方法的空接口:interface{},這篇文章主要介紹了GoLang之iface?和?eface?的區(qū)別,需要的朋友可以參考下2022-09-09