从 Writer 获取字符串的最佳方法

我有一段代码,返回一个网页使用内置的模板系统。它接受将结果标记写入的 ResponseWriter。现在我想要获得标记 Writer1,并在某些情况下将其放入数据库中。我分解出一个方法,接受一个正常的 Writer而不是 ResponseWriter,现在正试图得到的书面内容。啊哈-一个 Pipe可能是我需要的,然后我可以得到字符串与 ReadStringbufio库。但事实证明,从管道中出来的 PipeReaderReader不兼容(我需要用到 ReadString方法)。不行。大惊喜。所以我可以使用 PipeReader读入字节[] ,但是当 ReadString在那里的时候感觉有点不对。

那么最好的方法是什么呢?我应该坚持使用 Pipe并读取字节,还是手册中没有更好的内容?

53385 次浏览

如果函数接受 io.Writer,则可以传递 *bytes.Buffer来捕获输出。

// import "bytes"
buf := new(bytes.Buffer)
f(buf)
buf.String() // returns a string of what was written to it

如果需要 http。ResponseWriter,您可以使用 *httptest.ResponseRecorder。响应记录器保存所有可以发送给响应记录器的信息,但是主体只是一个 *bytes.Buffer

// import "net/http/httptest"
r := httptest.NewRecorder()
f(r)
r.Body.String() // r.Body is a *bytes.Buffer

下面的代码可能是将 Writer (或任何类型)转换为 string 的最简单方法

package main


import "fmt"
import "io"
import "reflect"


func main(){
var temp io.Writer
output := fmt.Sprint(temp)
fmt.Println(reflect.TypeOf(output))


}

产出:

string