Golang讀寫二進(jìn)制文件方法總結(jié)
使用 Golang 的 encoding/gob 包讀寫二進(jìn)制文件非常方便,而且代碼量也非常少。但是在需要自定義二進(jìn)制格式(自定義二進(jìn)制格式有可能做到更緊湊的數(shù)據(jù)表示和更快的讀寫速度)的場景下,這個包就不適用了,這時候就需要使用到 encoding/binary 包了。
encoding/binary 包實現(xiàn)了數(shù)字(number)和字節(jié)序列(byte sequences)之間的簡單轉(zhuǎn)換以及 varints 的編碼和解碼,varints 是一種使用一個或多個字節(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, "個值為:", data) } }
更多關(guān)于 encoding/binary 的內(nèi)容請參考此包的源代碼。
補(bǔ)充
除了上文的方法,下面小編還為大家整理了encoding/gob 包讀寫二進(jìn)制文件的其他方法
gob是Golang自帶的一個數(shù)據(jù)結(jié)構(gòu)序列化的編碼/解碼工具,和JSON、XML、Google 的 protocol buffers類似。gob編碼使用Encoder,解碼使用Decoder。一種典型的應(yīng)用場景就是RPC(remote procedure calls)。
接下來演示一下序列化數(shù)據(jù)后保存到本地,再反序列化本地的數(shù)據(jù)。
序列化數(shù)據(jù)后保存到本地
package main import ( "encoding/gob" "fmt" "os" ) func main() { data := "測試讀寫二進(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("編碼錯誤", 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang 字符串轉(zhuǎn)time類型實現(xiàn)
本文主要介紹了Golang 字符串轉(zhuǎn)time類型實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03GoLang中的iface?和?eface?的區(qū)別解析
iface 和 eface 都是 Go 中描述接口的底層結(jié)構(gòu)體,區(qū)別在于 iface 描述的接口包含方法,而 eface 則是不包含任何方法的空接口:interface{},這篇文章主要介紹了GoLang之iface?和?eface?的區(qū)別,需要的朋友可以參考下2022-09-09