2012年1月2日月曜日

bytes.NewBufferの使い方

Go言語プログラミング入門でもURLFetchAPIを利用した例で出てきたのですが、
掲載しているソースコードだとあまり良くないので再度使い方をまとめておきます。

import "bytes"

var writedata = make([]byte, 0, length)
var writebuf = bytes.NewBuffer(writedata)

書籍では、make([]byte, length)を使っていますが、この意味は、"長さと容量がlengthのバッファ"が作成されます。

bytes.NewBufferを利用する場合は、長さは0で、容量が必要なサイズに設定されている事が望ましいとされています。

したがって、"長さは0"というのを明示するために上記の例にしなければいけません。

実際に、GAE/G SDK 1.6.1で実行してみると、0埋めされたデータが出力されていました。
Buffer.Write([]byte)は容量が足りない場合は、バッファの容量を増やしてくれるように
なっているので、var writedata = make([]byte, 0)でも良いかもしれません。
この場合、容量が0なので、容量を内部的に増やす処理(新しいバッファを確保して上書きコピー)が実行されるため
実行コストが増えてしまいます。