さて、あなたは配列をスライスとして使おうとしました。それは期待していて[]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.Copyio.Copy