Подтвердить что ты не робот

Лучший способ получить строку из Writer в Go

У меня есть кусок кода, который возвращает веб-страницу, используя встроенную систему шаблонов. Он принимает ResponseWriter, на который записывается результирующая разметка. Теперь я хочу получить разметку как строку и поместить ее в базу данных в некоторых случаях. Я укомплектовал метод, который принимает обычный Writer вместо ResponseWriter, и теперь я пытаюсь перейти к написанному контенту. Aha - a Pipe может быть тем, что мне нужно, и затем я могу получить строку с ReadString из библиотеки bufio. Но оказывается, что PipeReader, выходящий из трубы, несовместим с Reader (который мне понадобится для метода ReadString). W00t. Большой сюрприз. Поэтому я мог просто читать в байте [] с помощью PipeReader, но он чувствует себя немного не так, когда ReadString есть.

Так что было бы лучшим способом сделать это? Должен ли я придерживаться Pipe и читать байты или есть что-то лучшее, чего я не нашел в руководстве?

4b9b3361

Ответ 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