関連記事
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。
Go 1.21 で、bytes.Buffer
に AvailableBuffer
という関数が追加されていたのですね。知らなかったです。
bytes.Buffer
の内部バッファの未使用部分を返してくれるというものですね。
取得したバッファのcapを超えない範囲のデータであればアロケーションフリーで操作出来ます。
Buffer.Write()
を利用する際の中間的なスライスを作成する手間も省けるので良い感じ。
サンプル
package bufferop import ( "bytes" "github.com/devlights/gomy/output" ) // AvailableBuffer は、Go 1.21 で追加された Buffer.AvailableBuffer() についてのサンプルです。 // // > AvailableBuffer returns an empty buffer with b.Available() capacity. // This buffer is intended to be appended to and passed to an immediately succeeding Buffer.Write call. // The buffer is only valid until the next write operation on b. // // > (AvailableBufferは、b.Available()の容量を持つ空のバッファを返します。 // このバッファは、直後のBuffer.Write呼び出しに追加され、渡されることを意図しています。 // このバッファは、bに対する次の書き込み操作が行われるまで有効です。) // // # REFERENCES // - https://pkg.go.dev/bytes@go1.22.4#Buffer.AvailableBuffer func AvailableBuffer() error { var ( buf bytes.Buffer data []byte logfn = func(buf *bytes.Buffer, data []byte) { output.Stdoutl("[Available ]", buf.Available()) output.Stdoutf("[AvailableBuffer]", "data=%v\tlen=%d\tcap=%d\n", data, len(data), cap(data)) output.Stdoutl("[Bytes Length ]", len(buf.Bytes())) output.StdoutHr() } ) buf.Grow(1 << 11) data = buf.AvailableBuffer() { logfn(&buf, data) data = append(data, []byte("helloworld")...) _, _ = buf.Write(data) } data = buf.AvailableBuffer() { logfn(&buf, data) var b [1 << 10]byte data = append(data, b[:]...) _, _ = buf.Write(data) } data = buf.AvailableBuffer() { logfn(&buf, data) } return nil /* $ task task: [build] go build . task: [run] ./try-golang -onetime ENTER EXAMPLE NAME: bufferop_available_buffer [Name] "bufferop_available_buffer" [Available ] 2048 [AvailableBuffer] data=[] len=0 cap=2048 [Bytes Length ] 0 -------------------------------------------------- [Available ] 2038 [AvailableBuffer] data=[] len=0 cap=2038 [Bytes Length ] 10 -------------------------------------------------- [Available ] 1014 [AvailableBuffer] data=[] len=0 cap=1014 [Bytes Length ] 1034 -------------------------------------------------- [Elapsed] 105.66µs */ }
サンプルは以下にアップしてあります。
try-golang/examples/basic/bufferop/availablebuffer.go at main · devlights/try-golang · GitHub
参考情報
Goのおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。