Leahcim
Leahcim

Reputation: 41949

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

I'm trying to return some json back from the server but get this error with the following code

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

With a little googling, I found this SO answer but couldn't get it to work (see second code sample with error message)

1st code sample

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

2nd code sample with error

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)

Upvotes: 60

Views: 84723

Answers (2)

Joyston
Joyston

Reputation: 836

This is how I solved my problem

readBuf, _ := ioutil.ReadAll(jsonStoredInBuffVariable)

This code will read from the buffer variable and output []byte value

Upvotes: 10

lnmx
lnmx

Reputation: 11154

Write requires a []byte (slice of bytes), and you have a *bytes.Buffer (pointer to a buffer).

You could get the data from the buffer with Buffer.Bytes() and give that to Write():

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

...or use Buffer.WriteTo() to copy the buffer contents directly to a Writer:

_, err = buffer.WriteTo(w)

Using a bytes.Buffer is not strictly necessary. json.Marshal() returns a []byte directly:

var buf []byte

buf, err = json.Marshal(thing)

_, err = w.Write(buf)

Upvotes: 76

Related Questions