いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-157 (bytes.Bufferはとても便利)

概要

bytes.Buffer 使ってますか? Goではバイト列を扱うことが多いので、この型はとても便利です。

Goを始めたときは、使いにくいと感じていたのですが、慣れてくると、この子を一番使っている気がします。

  • 文字列からバイト列にしたい
  • バイト列から文字列にしたい
  • io.Readerとして使いたい
  • io.Writerとして使いたい

などなどの時に利用できます。

io.Readerとしてもio.Writerとしても利用できるので、なにかの入力元にもなれるし出力先にもなれるということですね。

前にアップした

devlights.hatenablog.com

でも、頻繁に使っていますので参照ください。

サンプル

ゼロ値で利用

package bufferop

import (
    "bytes"
    "os"
)

// ZeroValue -- bytes.Buffer を ゼロ値 で利用した場合のサンプルです.
func ZeroValue() error {
    var (
        buf bytes.Buffer
    )

    // bytes.Buffer は、ゼロ値の場合は有効な空のバッファを表す
    if _, err := buf.Write([]byte("hello")); err != nil {
        return err
    }

    if _, err := buf.WriteTo(os.Stdout); err != nil {
        return err
    }

    return nil
}
$ make run
go get -d ./...
go run -race github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: bufferop_zero_value

[Name] "bufferop_zero_value"
hello

[Elapsed] 9.4µs

文字列からbytes.Bufferを生成

package bufferop

import (
    "bytes"
    "os"
)

// FromString -- bytes.Buffer を 文字列 から生成するサンプルです.
func FromString() error {
    const (
        str = "hello world"
    )

    // bytes.NewBufferString() を利用すると
    // 指定した文字列を初期値としたバッファを作成できる.

    var (
        buf = bytes.NewBufferString(str)
    )

    if _, err := buf.WriteTo(os.Stdout); err != nil {
        return err
    }

    return nil
}
$ make run
go get -d ./...
go run -race github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: bufferop_from_string

[Name] "bufferop_from_string"
hello world

[Elapsed] 7.2µs

バイト列からbytes.Bufferを生成

package bufferop

import (
    "bytes"
    "os"
)

// FromBytes -- bytes.Buffer を バイト列 から生成するサンプルです.
func FromBytes() error {
    // bytes.NewBuffer() を利用すると
    // 指定したバイト列を初期値としたバッファを作成できる
    var (
        //                           H   E   L   L   O   \n
        buf = bytes.NewBuffer([]byte{72, 69, 76, 76, 79, 10})
    )

    if _, err := buf.WriteTo(os.Stdout); err != nil {
        return err
    }

    return nil
}
$ make run
go get -d ./...
go run -race github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: bufferop_from_bytes

[Name] "bufferop_from_bytes"
HELLO


[Elapsed] 8.7µs

io.Readerとして利用

package bufferop

import (
    "bytes"
    "encoding/csv"

    "github.com/devlights/gomy/output"
)

// UseAsReader -- bytes.Buffer を io.Reader として利用するサンプルです.
func UseAsReader() error {
    // bytes.Buffer は io.Reader を実装しているので
    // io.Readerが必要な様々な場面で利用できる
    //
    // 注意点として、io.Readerを実装しているのは
    //   *bytes.Buffer
    // の方であるという点。
    //
    var (
        buf    = bytes.NewBufferString("1,2,3")
        reader = csv.NewReader(buf)
    )

    var (
        rec []string
        err error
    )

    if rec, err = reader.Read(); err != nil {
        return err
    }

    output.Stdoutl("[rec]", rec)

    return nil
}
$ make run
go get -d ./...
go run -race github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: bufferop_use_as_reader

[Name] "bufferop_use_as_reader"
[rec]                [1 2 3]


[Elapsed] 102µs

io.Writerとして利用

package bufferop

import (
    "bytes"
    "encoding/csv"

    "github.com/devlights/gomy/output"
)

// UseAsReader -- bytes.Buffer を io.Writer として利用するサンプルです.
func UseAsWriter() error {
    // bytes.Buffer は io.Writer を実装しているので
    // io.Readerが必要な様々な場面で利用できる
    //
    // 注意点として、io.Writerを実装しているのは
    //   *bytes.Buffer
    // の方であるという点。
    //
    var (
        rec    = []string{"1", "2", "3"}
        buf    = new(bytes.Buffer)
        writer = csv.NewWriter(buf)
    )

    if err := writer.Write(rec); err != nil {
        return err
    }
    writer.Flush()

    output.Stdoutl("[buf]", buf.String())

    return nil
}
$ make run 
go get -d ./...
go run -race github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: bufferop_use_as_writer

[Name] "bufferop_use_as_writer"
[buf]                1,2,3



[Elapsed] 122.5µs

参考資料

pkg.go.dev

devlights.hatenablog.com


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com