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