概要
bytes.Buffer
使ってますか? Goではバイト列を扱うことが多いので、この型はとても便利です。
Goを始めたときは、使いにくいと感じていたのですが、慣れてくると、この子を一番使っている気がします。
- 文字列からバイト列にしたい
- バイト列から文字列にしたい
- io.Readerとして使いたい
- io.Writerとして使いたい
などなどの時に利用できます。
io.Readerとしてもio.Writerとしても利用できるので、なにかの入力元にもなれるし出力先にもなれるということですね。
前にアップした
でも、頻繁に使っていますので参照ください。
サンプル
ゼロ値で利用
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
参考資料
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場