2
var buf bytes.Buffer

var outputBuffer [100]byte
b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"],"test":{"prop1":1,"prop2":[1,2,3]}}`)

w := zlib.NewWriter(&buf)
r, _ := zlib.NewReader(&buf)
w.Write(b)
w.Flush()
r.Read(outputBuffer)//cannot use outputBuffer (type [100]byte) as type []byte in function argument
fmt.Println(outputBuffer)

これを正しくするにはどうすればよいですか?ありがとう

4

2 に答える 2

5

さて、あなたは配列をスライスとして使おうとしました。それは期待していて[]byte、あなたはそれに与えました[100]byte。A[]byteには動的な幅がありますが、a[100]byteは常に100バイトです。配列のサイズはその型の一部です。a[1]intは。とは異なるタイプ[2]intです。そのため、ほとんどすべてがスライスで動作します。

しかし、それだけではありません。直接呼び出すとReadio.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

于 2013-01-31T15:36:59.547 に答える
-2

次のいずれかを試してください。

r.Read([]byte(outputBuffer))

また

r.Read(outputBuffer[0:100])

これは、スライスと固定サイズの配列という Go の概念に関係していると思います。これらの概念の詳細については、こちら (配列とスライスに関するセクション) を参照してください。

http://www.golang-book.com/6

たとえば、固定長配列ではなく最初に outputBuffer を適切なスライスにするなど、他の方法もありますが、上記のポインターを使用すると、それを理解できるはずです。

于 2013-01-31T10:05:06.980 に答える