The best way to get a string from a Writer
If your function accepts an io.Writer, you can pass a *bytes.Buffer
to capture the output.
// import "bytes"
buf := new(bytes.Buffer)
f(buf)
buf.String() // returns a string of what was written to it
If it requires an http.ResponseWriter, you can use a *httptest.ResponseRecorder
. A response recorder holds all information that can be sent to a ResponseWriter, but the body is just a *bytes.Buffer
.
// import "net/http/httptest"
r := httptest.NewRecorder()
f(r)
r.Body.String() // r.Body is a *bytes.Buffer
Comments
-
froderik about 2 years
I have a piece of code that returns a web page using the built-in template system. It accepts a
ResponseWriter
to which the resulting markup is written. I now want to get to the markup as a string and put it in a database in some cases. I factored out a method that accepts a normalWriter
instead of aResponseWriter
and am now trying to get to the written content. Aha - aPipe
may be what I need and then I can get the string withReadString
from thebufio
library. But it turns out that thePipeReader
coming out from the pipe is not compatible withReader
(that I would need for theReadString
method). W00t. Big surprise. So I could just read into byte[]s using thePipeReader
but it feels a bit wrong whenReadString
is there.So what would be the best way to do it? Should I stick with the
Pipe
and read bytes or is there something better that I haven't found in the manual? -
froderik over 11 yearsthanks - much nicer than my attempt. I suspected there would be something easier than what I did.
-
elkelk almost 8 yearsMaking a string vs converting from bytes to the written string is not the same thing.
-
FinalState about 7 yearsAt least made me smile )