Ik heb een stuk code die een webpagina retourneert met behulp van het ingebouwde sjabloonsysteem. Het accepteert een ResponseWriter
waarop de resulterende markup is geschreven. Ik wil nu naar de Markup als een string en in sommige gevallen in een database plaatsen. Ik heb een methode gegeven die een normale Writer
accepteert in plaats van een ResponseWriter
en probeer nu naar de geschreven inhoud. AHA – A Pipe
kan zijn wat ik nodig heb en dan kan ik de string krijgen met ReadString
van de bufio
bibliotheek. Maar het blijkt dat de PipeReader
uit de pijp niet compatibel is met Reader
(dat ik nodig heeft voor de ReadString
Method). W00T. Grote verrassing. Dus ik zou gewoon in Byte [] kunnen lezen met behulp van de PipeReader
, maar het voelt een beetje fout wanneer ReadString
is.
Dus wat zou de beste manier zijn om het te doen? Moet ik bijhouden met de Pipe
en bytes lezen of is er iets beter dat ik niet in de handleiding heb gevonden?
Antwoord 1, Autoriteit 100%
Als uw functie een IO.Writer accepteert, kunt u een *bytes.Buffer
passeren om de uitvoer vast te leggen.
// import "bytes"
buf := new(bytes.Buffer)
f(buf)
buf.String() // returns a string of what was written to it
Als het een HTTP.REEPONSEWRITER vereist, kunt u een *httptest.ResponseRecorder
gebruiken. Een responsrecorder bevat alle informatie die naar een responswriter kan worden verzonden, maar het lichaam is slechts een *bytes.Buffer
.
// import "net/http/httptest"
r := httptest.NewRecorder()
f(r)
r.Body.String() // r.Body is a *bytes.Buffer
Antwoord 2
De onderstaande code is mogelijk de eenvoudigste manier om schrijver (of elk type) naar string
te converteren
package main
import "fmt"
import "io"
import "reflect"
func main(){
var temp io.Writer
output := fmt.Sprint(temp)
fmt.Println(reflect.TypeOf(output))
}
Uitgang:
string