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

好吧,您尝试将数组用作切片。它期望 a[]byte而你给了它一个[100]byte. A[]byte具有动态宽度,而 a[100]byte始终为 100 字节。数组的大小是其类型的一部分;a与 a[1]int是不同的类型[2]int。这就是为什么几乎所有东西都在切片上运行。

但这不是唯一的事情。当您直接调用Readan时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传入。唯一的区别是我们保留了输出格式的副本,但是……如果输出太大以至于您不想将其保存在内存中怎么办?这就是为什么需要一个接口:您可以获取压缩数据,并将其未压缩版本直接写入任何输出流,包括标准输出,但也包括文件、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 回答