成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang 中的 Bytes 包詳解之 Bytes.Buffer

開發 后端
Bytes.Buffer 實現了 io.Writer、io.Reader、io.ByteScanner、io.RuneScanner、io.WriterTo、io.ByteWriter 和 io.ReaderFrom 等接口,可以很方便地實現對字節數據的讀寫和操作。

Golang 中的 bytes 包是其中一個 IO 操作標準庫,實現了對字節切片([]byte)的操作,提供了類似于 strings 包的功能。本文先講解一下 bytes 包中的結構體 bytes.Buffer。

bytes.Buffer

bytes.Buffer 實現了 io.Writer、io.Reader、io.ByteScanner、io.RuneScanner、io.WriterTo、io.ByteWriter 和 io.ReaderFrom 等接口,可以很方便地實現對字節數據的讀寫和操作。主要特點是提供了一個緩沖區,可以在內存中動態分配緩沖區,以高效地寫入和讀取字節數據。在處理數據時,特別是數據拼接操作時,效率往往比直接使用字符串拼接要高很多。結構體定義和對應的方法如下:

type Buffer struct {
	buf      []byte // contents are the bytes buf[off : len(buf)]
	off      int    // read at &buf[off], write at &buf[len(buf)]
	lastRead readOp // last read operation, so that Unread* can work correctly.
}

其中,buf 保存了實際的字節緩存,off 表示下一個讀寫操作的偏移量,lastRead 表示最后一次讀取操作的類型和大小。

bytes.Buffer 提供的主要方法包括:

  • ReadFrom,從 io.Reader 中讀取數據,并寫入到緩沖區中。
  • WriteTo,從緩沖區中讀取數據,并寫入到 io.Writer 中。
  • WriteByte、WriteRune、WriteString,分別用于將單個字節、Unicode 字符和字符串寫入緩沖區中。
  • ReadByte、ReadRune、ReadString,分別用于從緩沖區中讀取單個字節、Unicode 字符和字符串。
  • Bytes、String,返回緩沖區中的字節切片和字符串。
  • Reset,用于重置緩沖區,將其擴容為默認大小(64 字節)。

其他方法就不一一說明了,最好自己去看去使用去體會。

使用示例

簡單使用示例如下:

package main

import (
	"bytes"
	"encoding/binary"
	"fmt"
	"io"
	"os"
)

func main() {
	var buf bytes.Buffer

	// 寫入一個字節
	err := buf.WriteByte('a')
	if err != nil {
		fmt.Println(err)
		return
	}

	// 寫入一個字符串
	_, err = buf.WriteString("b")
	if err != nil {
		fmt.Println(err)
		return
	}

	// 寫入一個無符號整數
	var u uint32 = 12345
	err = binary.Write(&buf, binary.LittleEndian, u)
	if err != nil {
		fmt.Println(err)
		return
	}

	// 讀取一個字節
	b, err := buf.ReadByte()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(b)) // a

	// 讀取一個字符串
	s, err := buf.ReadString('\n')
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(s) // b

	// 讀取無符號整數
	var u2 uint32
	err = binary.Read(&buf, binary.LittleEndian, &u2)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(u2) // 12345

	// 拷貝到標準輸出中
	_, err = io.Copy(os.Stdout, &buf)
	if err != nil {
		fmt.Println(err)
		return
	}

	// 讀取到 []byte 中,并以字符串輸出
	data, err := io.ReadAll(&buf)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(data))
}

首先創建了一個 bytes.Buffer 對象 buf,分別使用 WriteByte、WriteString 和 binary.Write 方法向緩沖區中寫入一個字節、一個字符串和一個無符號整數。然后分別使用 ReadByte、ReadString 和 binary.Read 方法從緩沖區中讀取了一個字節、一個字符串和一個無符號整數。接下來使用 io.Copy 方法和 os.Stdout 將緩沖區中的數據拷貝到標準輸出中,最后使用 io.ReadAll 方法將緩沖區中的所有數據讀取到一個字節切片中,并轉換為一個字符串。

小結

使用 bytes.Buffer 可以方便高效地處理字節數據,避免頻繁地對底層的字節數組進行擴容和復制,從而提高性能。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-11-27 15:02:37

BytesGolang

2023-10-18 08:22:38

BufioGolang

2023-09-06 09:10:04

Golang字符串

2023-09-07 07:35:54

GolangBufio

2023-09-04 08:17:37

Golangstrings 包

2023-09-05 08:22:44

Golangstrings 包

2023-10-07 09:08:32

Golangbufio

2023-10-10 08:57:44

Golangbufio

2023-08-03 08:48:07

Golang接口

2023-12-11 08:39:14

Go語言字符串拼

2023-08-02 09:07:27

Golangio 包

2023-08-31 09:28:12

Golang可導出函數

2023-05-12 09:40:53

ContextGolang

2023-08-28 17:16:51

Golangio 包

2024-01-18 09:07:04

Errors函數Golang

2023-11-03 08:53:15

StrconvGolang

2023-11-13 21:55:12

Go編程

2023-08-08 14:51:29

2023-05-15 08:50:58

ContextGolang

2023-07-05 08:38:48

GolangGo語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区中文字幕在线观看 | 雨宫琴音一区二区在线 | 日韩精品成人在线 | h片在线看 | 黑人精品欧美一区二区蜜桃 | 国产精品区二区三区日本 | 日韩在线视频一区二区三区 | 国产成人福利在线观看 | 成人深夜福利 | 欧美一区二区三区一在线观看 | 日本成年免费网站 | 久久久久国产精品www | 黄片毛片免费观看 | 日韩国产欧美视频 | 青青操91| 国产精品久久精品 | 成人福利 | 久久男女视频 | 国产日韩一区二区 | 91视频大全| 欧美精品在线免费观看 | 九九九色 | 国产电影一区二区三区爱妃记 | 色永久 | 九七午夜剧场福利写真 | 国产精品一区二区不卡 | 午夜免费网站 | 精品91久久久 | 99热热热| 99精品一区二区 | 黄色片网站在线观看 | 精品1区 | 日韩中文字幕一区 | 伊人天堂网 | 超碰在线亚洲 | 国产日韩欧美 | 免费久久99精品国产婷婷六月 | 亚洲小视频在线播放 | 网站黄色在线免费观看 | 国产激情网站 | 久久综合九九 |