欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang讀寫二進(jìn)制文件方法總結(jié)

 更新時間:2023年05月10日 16:00:24   作者:路多辛  
使用?Golang?的?encoding/gob?包讀寫二進(jìn)制文件非常方便,而且代碼量也非常少,本文就來通過兩個示例帶大家了解一下encoding/gob的具體用法吧

使用 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)文章

  • Go并發(fā)調(diào)用的超時處理的方法

    Go并發(fā)調(diào)用的超時處理的方法

    這篇文章主要介紹了Go并發(fā)調(diào)用的超時處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Golang 字符串轉(zhuǎn)time類型實現(xiàn)

    Golang 字符串轉(zhuǎn)time類型實現(xiàn)

    本文主要介紹了Golang 字符串轉(zhuǎn)time類型實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 總結(jié)Go語言中defer的使用和注意要點

    總結(jié)Go語言中defer的使用和注意要點

    Go語言中的defer關(guān)鍵字實現(xiàn)比較特殊的功能,這篇文章給大家總結(jié)了關(guān)于Go語言中defer的使用和注意要點,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-09-09
  • golang中定時器cpu使用率高的現(xiàn)象詳析

    golang中定時器cpu使用率高的現(xiàn)象詳析

    這篇文章主要給大家介紹了關(guān)于golang中定時器cpu使用率高的現(xiàn)象的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • 使用Go實現(xiàn)TLS服務(wù)器和客戶端的示例

    使用Go實現(xiàn)TLS服務(wù)器和客戶端的示例

    本文主要介紹了Go實現(xiàn)TLS服務(wù)器和客戶端的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 源碼分析Go語言使用cgo導(dǎo)致線程增長的原因

    源碼分析Go語言使用cgo導(dǎo)致線程增長的原因

    這篇文章主要從一個cgo調(diào)用開始解析Go語言源碼,從而分析一下造成線程增長的原因,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一學(xué)習(xí)一下
    2023-06-06
  • GoLang中的iface?和?eface?的區(qū)別解析

    GoLang中的iface?和?eface?的區(qū)別解析

    iface 和 eface 都是 Go 中描述接口的底層結(jié)構(gòu)體,區(qū)別在于 iface 描述的接口包含方法,而 eface 則是不包含任何方法的空接口:interface{},這篇文章主要介紹了GoLang之iface?和?eface?的區(qū)別,需要的朋友可以參考下
    2022-09-09
  • Go設(shè)計模式之代理模式講解和代碼示例

    Go設(shè)計模式之代理模式講解和代碼示例

    這篇文章主要介紹了Go代理模式,代理是一種結(jié)構(gòu)型設(shè)計模式, 讓你能提供真實服務(wù)對象的替代品給客戶端使用,本文將對Go代理模式進(jìn)行講解以及代碼示例,需要的朋友可以參考下
    2023-07-07
  • 關(guān)于golang指針的有限操作詳解

    關(guān)于golang指針的有限操作詳解

    傳統(tǒng)意義上來說,指針是一個指向某個確切的內(nèi)存地址的值,這個內(nèi)存地址可以是任何數(shù)據(jù)或代碼的起始地址,在Go語言中有幾種東西可以代表"指針",本文給大家介紹的是關(guān)于golang指針的有限操作,感興趣的同學(xué)可以參考一下
    2023-08-08
  • 深度解密 Go 語言中的 sync.map

    深度解密 Go 語言中的 sync.map

    這篇文章主要介紹了深度解密 Go 語言中的 sync.map,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06

最新評論