一尘不染

如何转换(类型* bytes.Buffer)以用作w.Write参数中的[] byte

go

我正在尝试从服务器返回一些json,但是使用以下代码获取此错误

cannot use buffer (type *bytes.Buffer) as type []byte in argument to w.Write

稍加谷歌搜索,我找到了这个答案,但无法使其正常工作(请参阅第二个代码示例,并显示错误消息)

第一个代码样本

buffer := new(bytes.Buffer)

for _, jsonRawMessage := range sliceOfJsonRawMessages{
    if err := json.Compact(buffer, jsonRawMessage); err != nil{
        fmt.Println("error")

    }

}   
fmt.Println("json returned", buffer)//this is json
w.Header().Set("Content-Type", contentTypeJSON)

w.Write(buffer)//error: cannot use buffer (type *bytes.Buffer) as type []byte in argument to w.Write

第二个代码示例有错误

cannot use foo (type *bufio.Writer) as type *bytes.Buffer in argument to json.Compact
 cannot use foo (type *bufio.Writer) as type []byte in argument to w.Write


var b bytes.Buffer
foo := bufio.NewWriter(&b)

for _, d := range t.J{
    if err := json.Compact(foo, d); err != nil{
        fmt.Println("error")

    }

}


w.Header().Set("Content-Type", contentTypeJSON)

w.Write(foo)

阅读 291

收藏
2020-07-02

共1个答案

一尘不染

写操作需要一个[]byte(字节片),而您有一个*bytes.Buffer(指向缓冲区的指针)。

您可以使用Buffer.Bytes()从缓冲区中获取数据,并将其提供给Write()

_, err = w.Write(buffer.Bytes())

…或使用Buffer.WriteTo()将缓冲区内容直接复制到Writer

_, err = buffer.WriteTo(w)

使用a bytes.Buffer并非绝对必要。
json.Marshal()[]byte直接返回一个:

var buf []byte

buf, err = json.Marshal(thing)

_, err = w.Write(buf)
2020-07-02