Voglio utilizzare andare a leggere un pezzo da un file
, trattarlo come un string
e gzip
questo pezzo. Io so come leggere dal file
e trattarlo come un string
, ma quando si tratta di "compress/gzip"
sono perduto. Devo creare un io.writer
, che scrivere ad un (fetta byte) buf
, utilizzare il gzip.Writer(io.writer)
per ottenere un puntatore scrittore alla io.writer
..e quindi utilizzare gzip.Write(chunk_of_file)
a scrivere il chunk_of_file
a buf
? quindi avrei bisogno di trattare la stringa come una fetta di byte ..come posso usare gzip su una stringa in golang?
risposta
È possibile scrivere utilizzando gzip.Writer
come implementa io.Writer
.
Esempio:
package main
import (
"bytes"
"compress/gzip"
"fmt"
)
func main() {
var b bytes.Buffer
gz := gzip.NewWriter(&b)
if _, err := gz.Write([]byte("YourDataHere")); err != nil {
panic(err)
}
if err := gz.Flush(); err != nil {
panic(err)
}
if err := gz.Close(); err != nil {
panic(err)
}
fmt.Println(b)
}
Se si desidera impostare il livello di compressione (di default è "-1" from compress/flate
) è possibile utilizzare gzip.NewWriterLevel
.
mi sento come si deve notare che lo scrittore non sarà effettivamente scrivere i byte compressi al buffer fino 'gz.Flush()' viene chiamato. Il flush viene anche chiamato con 'gz.Close()', ma l'esempio del campo da giuoco non arriva mai così lontano. – Nenoco
@Nenoco Hai ragione. Ho aggiunto la dichiarazione "Flush". – Intermernet
Un'altra cosa è che Flush() scrive solo i dati _current_ al buffer. Non finisce l'intero formato GZIP. Quindi, in questo caso, è abbastanza inutile, dal momento che ciò che è scritto sull'ultima riga non è una struttura GZIP valida. Devi chiamare Close() _before_ fai qualsiasi cosa con il buffer. –
possibile duplicato di [Come utilizzare il pacchetto "compress/gzip" di golang per gzipare un file?] (Http://stackoverflow.com/questions/16890648/how-can-i-use-golangs-compress-gzip -package-to-gzip-a-file) –
sono confuso dalla tua domanda, in Go una stringa * è * un byte [] quindi se si vuole che sia uno, basta convertirlo come tale [] byte (mystringvar) – mzimmerman