【问题标题】:The best way to get a string from a Writer从 Writer 获取字符串的最佳方法
【发布时间】:2026-02-23 18:30:01
【问题描述】:

我有一段使用内置模板系统返回网页的代码。它接受一个ResponseWriter,生成的标记被写入其中。我现在想获得标记作为字符串,并在某些情况下将其放入数据库中。我分解出一个接受普通Writer 而不是ResponseWriter 的方法,现在我正在尝试获取书面内容。啊哈 - Pipe 可能是我需要的,然后我可以从 bufio 库中获取带有 ReadString 的字符串。但事实证明,从管道中出来的 PipeReaderReader 不兼容(我需要 ReadString 方法)。 W00吨。大惊喜。所以我可以使用PipeReader 读入byte[]s,但是当ReadString 在那里时感觉有点不对劲。

那么最好的方法是什么?我应该坚持使用Pipe 并读取字节,还是我在手册中没有找到更好的东西?

【问题讨论】:

    标签: io go


    【解决方案1】:

    如果您的函数接受 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。响应记录器保存所有可以发送到 ResponseWriter 的信息,但正文只是 *bytes.Buffer

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

    【讨论】:

    • 谢谢 - 比我的尝试好得多。我怀疑会有比我做的更容易的事情。
    【解决方案2】:

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

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

    输出:

    string
    

    【讨论】:

    • 制作字符串与将字节转换为写入的字符串不是一回事。
    • 至少让我笑了)