de beste manier om een ​​string van een schrijver

Ik heb een stuk code die een webpagina retourneert met behulp van het ingebouwde sjabloonsysteem. Het accepteert een ResponseWriterwaarop 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 Writeraccepteert in plaats van een ResponseWriteren probeer nu naar de geschreven inhoud. AHA – A Pipekan zijn wat ik nodig heb en dan kan ik de string krijgen met ReadStringvan de bufiobibliotheek. Maar het blijkt dat de PipeReaderuit de pijp niet compatibel is met Reader(dat ik nodig heeft voor de ReadStringMethod). W00T. Grote verrassing. Dus ik zou gewoon in Byte [] kunnen lezen met behulp van de PipeReader, maar het voelt een beetje fout wanneer ReadStringis.

Dus wat zou de beste manier zijn om het te doen? Moet ik bijhouden met de Pipeen 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.Bufferpasseren 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.ResponseRecordergebruiken. 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

Other episodes