Ich muss Daten anfordern, verarbeiten und in CSV formatieren und sie dann auf Anfrage über einen Webdienst senden.
Angenommen, die angeforderten und verarbeiteten Daten befinden sich in data
unten, ist mir dies mithilfe einer temporären Zwischendatei gelungen:
package main import ( "encoding/csv" "io/ioutil" "net/http" "os" "strconv" "github.com/go-chi/chi/v5" ) type data struct { name string age int } func main() { data := []data{ {"john", 30}, {"jane", 20}, } tempfilename := "temp.csv" // create temporary intermediate file file, err := os.create(tempfilename) defer file.close() if err != nil { panic(err) } w := csv.newwriter(file) var csvdata [][]string for _, record := range data { row := []string{record.name, strconv.itoa(record.age)} csvdata = append(csvdata, row) } w.writeall(csvdata) // read temporary intermediate file to send it via http filebytes, err := ioutil.readfile(tempfilename) if err != nil { panic(err) } // send the file on request router := chi.newrouter() router.get("/data", func(w http.responsewriter, r *http.request) { w.header().set("content-type", "application/octet-stream") w.writeheader(http.statusok) w.write(filebytes) }) http.listenandserve(":8087", router) }
Anfrage erfolgreich:
PS C:\temp> wget http://localhost:8087/data --2023-06-13 15:34:00-- http://localhost:8087/data Resolving localhost (localhost)... ::1, 127.0.0.1 Connecting to localhost (localhost)|::1|:8087... connected. HTTP request sent, awaiting response... 200 OK Length: 16 [application/octet-stream] Saving to: 'data' data 100%[=================================================>] 16 --.-KB/s in 0s 2023-06-13 15:34:00 (523 KB/s) - 'data' saved [16/16] PS C:\temp> cat data John,30 Jane,20
So weit so gut – jetzt möchte ich die Zwischendateien über
löschenIch verstehe immer noch nicht ganz, wie man io.*
和bufio.*
verwendet, um sich mit dem erforderlichen Typ anzumelden:
csv.newwriter()
需要 *os.file
并返回 *csv.writer
*csv.writer
内容需要以某种方式提取为 byte
...http.responsewriter.write()
Was sind die allgemeinen Mechanismen (und die für diesen Fall spezifischen Mechanismen), um verschiedene Arten von Problemen bei der Manipulation von Speicherdateien zu lösen?
csv.newwriter
采用 io.writer
,因此您可以将 http.responsewriter
wird an ihn übergeben, ohne dass der Inhalt in eine Datei oder einen Speicher geschrieben wird.
Hier ist die Demo:
package main import ( "encoding/csv" "fmt" "net/http" "strconv" "github.com/go-chi/chi/v5" ) type Data struct { Name string Age int } func main() { router := chi.NewRouter() router.Get("/data", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/octet-stream") w.WriteHeader(http.StatusOK) data := []Data{ {"John", 30}, {"Jane", 20}, } csvWriter := csv.NewWriter(w) var csvData [][]string for _, record := range data { row := []string{record.Name, strconv.Itoa(record.Age)} csvData = append(csvData, row) } if err := csvWriter.WriteAll(csvData); err != nil { // handle the error fmt.Println(err) } }) http.ListenAndServe(":8087", router) }
Das obige ist der detaillierte Inhalt vonWie kann ich in eine Datei im Speicher schreiben und sie dann über HTTP senden, ohne eine Zwischendatei zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!