婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > go原生庫的中bytes.Buffer用法

go原生庫的中bytes.Buffer用法

熱門標簽:百度地圖標注后傳給手機 壽光微信地圖標注 外呼系統用什么卡 excel地圖標注分布數據 評價高的400電話辦理 電話機器人軟件免費 阿克蘇地圖標注 外呼系統顯本地手機號 涿州代理外呼系統

1 bytes.Buffer定義

bytes.Buffer提供可擴容的字節緩沖區,實質是對切片的封裝;結構中包含一個64字節的小切片,避免小內存分配:

// A Buffer is a variable-sized buffer of bytes with Read and Write methods.
// The zero value for Buffer is an empty buffer ready to use.
type Buffer struct {
 buf       []byte   // contents are the bytes buf[off : len(buf)]
 off       int      // read at buf[off], write at buf[len(buf)]--->指示讀指針
 bootstrap [64]byte // memory to hold first slice; helps small buffers avoid allocation.
 lastRead  readOp   // last read operation, so that Unread* can work correctly.
}

2 初始化bytes.Buffer的方法

1) var buf bytes.Buffer ->定義一個空的字節緩沖區

2) func NewBuffer(buf []byte) *Buffer { return Buffer{buf: buf} } -->將字節切片初始化為緩沖區

3) func NewBufferString(s string) *Buffer {return Buffer{buf: []byte(s)}} -->將字符串初始化為緩沖區

3 提供的主要API函數

1)寫字節流數據到緩沖區

// Write appends the contents of p to the buffer, growing the buffer as
// needed. The return value n is the length of p; err is always nil. If the
// buffer becomes too large, Write will panic with ErrTooLarge.
func (b *Buffer) Write(p []byte) (n int, err error) {
 b.lastRead = opInvalid
 m := b.grow(len(p))
 return copy(b.buf[m:], p), nil
}

2)寫字符串到緩沖區

// WriteString appends the contents of s to the buffer, growing the buffer as
// needed. The return value n is the length of s; err is always nil. If the
// buffer becomes too large, WriteString will panic with ErrTooLarge.
func (b *Buffer) WriteString(s string) (n int, err error) {
 b.lastRead = opInvalid
 //返回寫入的index
 m := b.grow(len(s))
 return copy(b.buf[m:], s), nil
}

3)從緩沖區中讀取數據

// Read reads the next len(p) bytes from the buffer or until the buffer
// is drained. The return value n is the number of bytes read. If the
// buffer has no data to return, err is io.EOF (unless len(p) is zero);
// otherwise it is nil.
func (b *Buffer) Read(p []byte) (n int, err error) {
 b.lastRead = opInvalid
 if b.off >= len(b.buf) {
  // Buffer is empty, reset to recover space.
  b.Truncate(0)
  if len(p) == 0 {
   return
  }
  return 0, io.EOF
 }
 n = copy(p, b.buf[b.off:])
 b.off += n
 if n > 0 {
  b.lastRead = opRead
 }
 return
}

4)從緩沖區中讀取字符串,直到分隔符delim 位置

// ReadString reads until the first occurrence of delim in the input,
// returning a string containing the data up to and including the delimiter.
// If ReadString encounters an error before finding a delimiter,
// it returns the data read before the error and the error itself (often io.EOF).
// ReadString returns err != nil if and only if the returned data does not end
// in delim.
func (b *Buffer) ReadString(delim byte) (line string, err error) {
 slice, err := b.readSlice(delim)
 return string(slice), err
}

5)將未被讀取的字節數據返回

// Bytes returns a slice of length b.Len() holding the unread portion of the buffer.
// The slice is valid for use only until the next buffer modification (that is,
// only until the next call to a method like Read, Write, Reset, or Truncate).
// The slice aliases the buffer content at least until the next buffer modification,
// so immediate changes to the slice will affect the result of future reads.
func (b *Buffer) Bytes() []byte { return b.buf[b.off:] }

6)將未被讀取的字節數據以字符串形式返回

// String returns the contents of the unread portion of the buffer
// as a string. If the Buffer is a nil pointer, it returns "nil>".
func (b *Buffer) String() string {
 if b == nil {
  // Special case, useful in debugging.
  return "nil>"
 }
 return string(b.buf[b.off:])
}

7)返回緩沖區當前容量

// Cap returns the capacity of the buffer's underlying byte slice, that is, the
// total space allocated for the buffer's data.
func (b *Buffer) Cap() int { return cap(b.buf) }

8)返回未被讀取的字節數據大小

// Len returns the number of bytes of the unread portion of the buffer;
// b.Len() == len(b.Bytes()).
func (b *Buffer) Len() int { return len(b.buf) - b.off }

4 bytes.Buffer自動擴容機制

當向緩沖區寫入數據時,首先會檢查當前容量是否滿足需求,如果不滿足分三種情況處理:

1)當前內置緩沖區切片buf為空,且寫入數據量小于bootstrap的大小(64字節),則bootstrap作為buf

2)當前未讀數據長度+新寫入數據長度小于等于緩沖區容量的1/2,則挪動數據(將未讀的數據放到已讀數據位置)

3)以上條件不滿足,只能重新分配切片,容量設定為2*cap(b.buf) + n,即兩倍原來的緩沖區容量+寫入數據量大小

// grow grows the buffer to guarantee space for n more bytes.
// It returns the index where bytes should be written.
// If the buffer can't grow it will panic with ErrTooLarge.
func (b *Buffer) grow(n int) int {
 m := b.Len()
 // If buffer is empty, reset to recover space.
 if m == 0  b.off != 0 {
  b.Truncate(0)
 }
 //如果需要的容量大于現在的容量--->
 if len(b.buf)+n > cap(b.buf) {
  var buf []byte
  //現有的預備64byte可以滿足
  if b.buf == nil  n = len(b.bootstrap) {
   buf = b.bootstrap[0:]
   //實際需要的小于本身切片容量
  } else if m+n = cap(b.buf)/2 {
   // We can slide things down instead of allocating a new
   // slice. We only need m+n = cap(b.buf) to slide, but
   // we instead let capacity get twice as large so we
   // don't spend all our time copying.
   copy(b.buf[:], b.buf[b.off:])
   buf = b.buf[:m]
  } else {
   // not enough space anywhere
   //不夠,那就分配2倍加n的容量
   buf = makeSlice(2*cap(b.buf) + n)
   copy(buf, b.buf[b.off:])
  }
  b.buf = buf
  b.off = 0
 }
 b.buf = b.buf[0 : b.off+m+n]
 return b.off + m
}

5 bytes.Buffer的局限

bytes.Buffer提供了對切片的初步封裝,但也沒做太多的事;對于已讀的數據無法操作。

補充:Golang bytes.Buffer 用法精述

1.簡介

bytes.Buffer 是 Golang 標準庫中的緩沖區,具有讀寫方法和可變大小的字節存儲功能。緩沖區的零值是一個待使用的空緩沖區。

定義如下:

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.
}

注意要點:

(1)從 bytes.Buffer 讀取數據后,被成功讀取的數據仍保留在原緩沖區,只是無法被使用,因為緩沖區的可見數據從偏移 off 開始,即buf[off : len(buf)]。

2.常用方法

(1)聲明一個 Buffer

var b bytes.Buffer           //直接定義一個Buffer變量,不用初始化,可以直接使用
b := new(bytes.Buffer)       //使用New返回Buffer變量
b := bytes.NewBuffer(s []byte)     //從一個[]byte切片,構造一個Buffer
b := bytes.NewBufferString(s string) //從一個string變量,構造一個Buffer

(2)往 Buffer 中寫入數據

b.Write(d []byte) (n int, err error)      //將切片d寫入Buffer尾部
b.WriteString(s string) (n int, err error)   //將字符串s寫入Buffer尾部
b.WriteByte(c byte) error        //將字符c寫入Buffer尾部
b.WriteRune(r rune) (n int, err error)      //將一個rune類型的數據放到緩沖區的尾部
b.ReadFrom(r io.Reader) (n int64, err error) //從實現了io.Reader接口的可讀取對象寫入Buffer尾部

(3)從 Buffer 中讀取數據

//讀取 n 個字節數據并返回,如果 buffer 不足 n 字節,則讀取全部
b.Next(n int) []byte
//一次讀取 len(p) 個 byte 到 p 中,每次讀取新的內容將覆蓋p中原來的內容。成功返回實際讀取的字節數,off 向后偏移 n,buffer 沒有數據返回錯誤 io.EOF
b.Read(p []byte) (n int, err error)
//讀取第一個byte并返回,off 向后偏移 n
b.ReadByte() (byte, error)
//讀取第一個 UTF8 編碼的字符并返回該字符和該字符的字節數,b的第1個rune被拿掉。如果buffer為空,返回錯誤 io.EOF,如果不是UTF8編碼的字符,則消費一個字節,返回 (U+FFFD,1,nil)
b.ReadRune() (r rune, size int, err error)
//讀取緩沖區第一個分隔符前面的內容以及分隔符并返回,緩沖區會清空讀取的內容。如果沒有發現分隔符,則返回讀取的內容并返回錯誤io.EOF
b.ReadBytes(delimiter byte) (line []byte, err error)
//讀取緩沖區第一個分隔符前面的內容以及分隔符并作為字符串返回,緩沖區會清空讀取的內容。如果沒有發現分隔符,則返回讀取的內容并返回錯誤 io.EOF
b.ReadString(delimiter byte) (line string, err error)
//將 Buffer 中的內容輸出到實現了 io.Writer 接口的可寫入對象中,成功返回寫入的字節數,失敗返回錯誤
b.WriteTo(w io.Writer) (n int64, err error)

(4)其它操作

b.Bytes() []byte  //返回字節切片
b.Cap() int    //返回 buffer 內部字節切片的容量
b.Grow(n int)   //為 buffer 內部字節切片的容量增加 n 字節
b.Len() int    //返回緩沖區數據長度,等于 len(b.Bytes())
b.Reset()     //清空數據
b.String() string  //字符串化
b.Truncate(n int)  //丟棄緩沖區中除前n個未讀字節以外的所有字節。如果 n 為負數或大于緩沖區長度,則引發 panic
b.UnreadByte() error //將最后一次讀取操作中被成功讀取的字節設為未被讀取的狀態,即將已讀取的偏移 off 減 1
b.UnreadRune() error //將最后一次 ReadRune() 讀取操作返回的 UTF8 字符 rune設為未被讀取的狀態,即將已讀取的偏移 off 減去 字符 rune 的字節數

3.使用示例

(1)從文件 test.txt 中讀取全部內容追加到 buffer 尾部

test.txt 的內容為:

My name is dablelv

具體實現:

package main
import (
 "os"
 "fmt"
 "bytes"
)
func main() {
    file, _ := os.Open("./test.txt")    
    buf := bytes.NewBufferString("Hello world ")    
    buf.ReadFrom(file)              //將text.txt內容追加到緩沖器的尾部    
    fmt.Println(buf.String())
}

編譯運行輸出:

Hello world My name is dablelv

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Go語言中使用 buffered channel 實現線程安全的 pool
  • C#語言使用gRPC、protobuf(Google Protocol Buffers)實現文件傳輸功能
  • 詳解Django-channels 實現WebSocket實例
  • Django使用Channels實現WebSocket的方法
  • Django Channels 實現點對點實時聊天和消息推送功能
  • 再次探討go實現無限 buffer 的 channel方法

標簽:欽州 重慶 汕頭 銅川 梅河口 蘭州 雞西 吐魯番

巨人網絡通訊聲明:本文標題《go原生庫的中bytes.Buffer用法》,本文關鍵詞  原生,庫,的,中,bytes.Buffer,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《go原生庫的中bytes.Buffer用法》相關的同類信息!
  • 本頁收集關于go原生庫的中bytes.Buffer用法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    99久久精品一区二区| 国产欧美日韩麻豆91| 99久久伊人精品| 国产成人亚洲综合a∨婷婷| 久久国内精品自在自线400部| 亚洲成人激情av| 日日夜夜免费精品| 日韩高清不卡一区| 激情另类小说区图片区视频区| 日本不卡在线视频| 极品少妇xxxx精品少妇| 国产一区二区三区四| 成人动漫视频在线| 色综合久久久久久久久久久| 色av成人天堂桃色av| 欧美日韩成人综合天天影院| 91精品国产综合久久久蜜臀图片| 欧美一区二区三区播放老司机| 日韩欧美一级二级三级| 国产亚洲va综合人人澡精品 | 日本美女一区二区三区| 激情综合亚洲精品| 成人h动漫精品一区二区| 91久久精品一区二区| 日韩西西人体444www| 欧美国产视频在线| 亚洲第一综合色| 国产一区日韩二区欧美三区| av爱爱亚洲一区| 51久久夜色精品国产麻豆| 久久精品一区二区三区四区| 亚洲欧美日韩国产另类专区| 蜜桃一区二区三区在线| 99在线精品一区二区三区| 欧美男女性生活在线直播观看| 亚洲精品一区二区精华| 一区二区激情视频| 国产成人鲁色资源国产91色综| 欧美做爰猛烈大尺度电影无法无天| 日韩女优制服丝袜电影| 一区二区三区不卡在线观看| 国产美女在线观看一区| 欧美亚洲一区二区在线观看| 亚洲国产精品av| 久久99最新地址| 欧美日韩一级大片网址| 国产精品久久久久久久蜜臀| 久久99日本精品| 欧美日韩成人在线| 亚洲欧美日韩成人高清在线一区| 蜜桃精品视频在线观看| 欧美影院精品一区| 亚洲精品乱码久久久久| 国产精品2024| 精品福利一区二区三区免费视频| 亚洲综合久久久久| 一本到不卡免费一区二区| 国产午夜精品一区二区三区四区| 日韩avvvv在线播放| 欧美综合一区二区三区| 亚洲日韩欧美一区二区在线| 国产一区999| 精品对白一区国产伦| 日韩在线一二三区| 在线播放/欧美激情| 丝袜美腿亚洲一区二区图片| 欧美性做爰猛烈叫床潮| 一区二区三区美女视频| 91在线你懂得| 亚洲视频在线观看三级| 99久久夜色精品国产网站| 欧美激情艳妇裸体舞| 国产成人av一区二区三区在线 | 精品在线视频一区| 日韩视频永久免费| 日本不卡一区二区三区| 日韩三级精品电影久久久| 蜜臀久久99精品久久久久宅男| 日韩视频在线一区二区| 激情图区综合网| 久久久三级国产网站| 粉嫩欧美一区二区三区高清影视| 国产精品免费观看视频| 色婷婷综合久久久久中文 | 精品一区二区三区免费毛片爱| 日韩视频在线你懂得| 国产一区欧美日韩| 国产精品国产a级| 91麻豆.com| 日韩福利电影在线| 国产亚洲欧洲997久久综合| av一区二区三区在线| 亚洲裸体xxx| 欧美一区二区视频在线观看2020 | 国产精品少妇自拍| 91免费视频观看| 日本欧美加勒比视频| 久久久久久久久久看片| 色婷婷av一区二区三区大白胸| 亚洲va欧美va国产va天堂影院| 欧美一区二区成人| av在线播放一区二区三区| 日本欧美一区二区三区| 国产精品第四页| 欧美日韩一二区| 粉嫩aⅴ一区二区三区四区五区| 最新热久久免费视频| 91精品国产欧美一区二区| 国产成人精品亚洲日本在线桃色| 亚洲一区二区综合| 欧美国产禁国产网站cc| 6080午夜不卡| 91片在线免费观看| 韩国av一区二区三区四区| 亚洲久本草在线中文字幕| 精品99999| 欧美性猛交xxxx乱大交退制版| 精品一区二区三区免费观看| 一区二区三区四区在线播放| 久久久午夜精品理论片中文字幕| 欧美日韩在线播放一区| 91婷婷韩国欧美一区二区| 精品一区二区在线播放| 亚洲成人av一区二区| 中文字幕成人在线观看| 精品久久久久久久久久久久包黑料 | 国产一区二区三区在线看麻豆| 亚洲国产综合人成综合网站| 欧美国产乱子伦| 精品奇米国产一区二区三区| 欧美一卡2卡三卡4卡5免费| 一本大道久久a久久精品综合| 国产成人精品一区二| 国产伦精一区二区三区| 久久精品国产免费| 偷拍亚洲欧洲综合| 午夜精品在线看| 性欧美疯狂xxxxbbbb| 亚洲综合在线第一页| 亚洲精品少妇30p| 一级特黄大欧美久久久| 亚洲精品视频在线观看网站| 国产精品动漫网站| 国产精品家庭影院| 亚洲日本一区二区三区| 中文字幕中文字幕中文字幕亚洲无线| 欧美xxxxxxxx| 欧美国产一区二区在线观看| 欧美国产精品v| 亚洲图片欧美激情| 亚洲最大成人网4388xx| 亚洲高清三级视频| 日韩国产精品91| 久久99精品国产麻豆婷婷 | 99久久伊人精品| 51精品视频一区二区三区| 7777精品久久久大香线蕉| 欧美二区在线观看| 欧美r级电影在线观看| 久久综合久久鬼色| 中文欧美字幕免费| 最新成人av在线| 亚洲成人av免费| 狠狠色丁香婷婷综合| 成人av在线播放网址| 色爱区综合激月婷婷| 欧美一区二区三区免费大片| 久久综合久久综合九色| 综合久久国产九一剧情麻豆| 亚洲黄色尤物视频| 日韩精品成人一区二区在线| 美国三级日本三级久久99| 国产成人精品影视| 欧美日韩激情一区二区| 欧美不卡123| 成人欧美一区二区三区白人| 午夜一区二区三区视频| 国产一区二区剧情av在线| www.99精品| 日韩一区二区三区三四区视频在线观看| 91精品国产高清一区二区三区蜜臀| 久久夜色精品国产欧美乱极品| 国产精品色哟哟网站| 偷拍日韩校园综合在线| 成人h精品动漫一区二区三区| 欧美三级电影网站| 国产日韩欧美精品一区| 亚洲愉拍自拍另类高清精品| 蜜桃视频一区二区三区在线观看 | 亚洲国产中文字幕| 韩国av一区二区| 色哟哟亚洲精品| 日韩视频免费直播| 洋洋av久久久久久久一区| 国产.欧美.日韩| 精品日韩在线观看| 日韩av一区二区在线影视| 91蜜桃在线观看| 国产午夜精品美女毛片视频| 亚洲高清中文字幕|