概要
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 } returnnil }
$ 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 } returnnil }
$ 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 } returnnil }
$ 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) returnnil }
$ 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][123][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()) returnnil }
$ 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
参考資料
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場