さて、あなたは配列をスライスとして使おうとしました。それは期待していて[]byte
、あなたはそれに与えました[100]byte
。A[]byte
には動的な幅がありますが、a[100]byte
は常に100バイトです。配列のサイズはその型の一部です。a[1]int
は。とは異なるタイプ[2]int
です。そのため、ほとんどすべてがスライスで動作します。
しかし、それだけではありません。直接呼び出すとRead
、io.Reader
ターゲットスライスを拡張せずに、現在の幅まで塗りつぶします。出力スライスを10バイト幅(make([]byte, 10)
)にした場合、表示される出力はになります{"Name":"W
。
var in bytes.Buffer
b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"],"test":{"prop1":1,"prop2":[1,2,3]}}`)
w := zlib.NewWriter(&in)
w.Write(b)
w.Close()
var out bytes.Buffer
r, _ := zlib.NewReader(&in)
io.Copy(&out, r)
os.Stdout.Write(out.Bytes())
ただし、この時点で、標準ライブラリのドキュメントと同じように、にos.Stdout
渡すこともできます。唯一の違いは、出力形式のコピーを保持していることですが、出力が大きすぎてメモリに保持したくない場合はどうでしょうか。そのため、インターフェイスが必要です。圧縮データを取得し、その非圧縮バージョンをstdoutだけでなく、ファイル、UNIXソケット、ネットワークソケットなどの出力ストリームに直接書き込むことができます。io.Copy
io.Copy