Incorporamento di file di testo
Se parliamo di file di testo, possono essere facilmente incorporati nel codice sorgente stesso. Usa semplicemente le virgolette posteriori per dichiarare il stringletterale in questo modo:
const html = `
<html>
<body>Example embedded HTML content.</body>
</html>
`
// Sending it:
w.Write([]byte(html)) // w is an io.Writer
Suggerimento per l'ottimizzazione:
Poiché la maggior parte delle volte dovrai solo scrivere la risorsa su un io.Writer, puoi anche memorizzare il risultato di una []byteconversione:
var html = []byte(`
<html><body>Example...</body></html>
`)
// Sending it:
w.Write(html) // w is an io.Writer
L'unica cosa a cui devi stare attento è che i letterali stringa non elaborati non possono contenere il carattere di virgolette (`). I letterali stringa non elaborati non possono contenere sequenze (a differenza dei letterali stringa interpretati), quindi se il testo che si desidera incorporare contiene virgolette all'indietro, è necessario rompere il valore letterale stringa non elaborato e concatenare le virgolette all'indietro come valori letterali stringa interpretati, come in questo esempio:
var html = `<p>This is a back quote followed by a dot: ` + "`" + `.</p>`
Le prestazioni non vengono influenzate, poiché queste concatenazioni verranno eseguite dal compilatore.
Incorporamento di file binari
Archiviazione come fetta di byte
Per i file binari (es. Immagini) più compatto (per quanto riguarda il binario nativo risultante) e più efficiente sarebbe avere il contenuto del file come un []bytenel codice sorgente. Questo può essere generato da strumenti / librerie di terze parti come go-bindata .
Se non desideri utilizzare una libreria di terze parti per questo, ecco un semplice frammento di codice che legge un file binario e genera il codice sorgente Go che dichiara una variabile di tipo []byteche verrà inizializzata con il contenuto esatto del file:
imgdata, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Print("var imgdata = []byte{")
for i, v := range imgdata {
if i > 0 {
fmt.Print(", ")
}
fmt.Print(v)
}
fmt.Println("}")
Output di esempio se il file conterrebbe byte da 0 a 16 (provalo su Go Playground ):
var imgdata = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
Memorizzazione come base64 string
Se il file non è "troppo grande" (la maggior parte delle immagini / icone è qualificata), ci sono anche altre opzioni possibili. Puoi convertire il contenuto del file in un Base64 stringe memorizzarlo nel tuo codice sorgente. All'avvio dell'applicazione ( func init()) o quando necessario, è possibile decodificarla al []bytecontenuto originale . Go ha un bel supporto per la codifica Base64 nel encoding/base64pacchetto.
Convertire un file (binario) in base64 stringè semplice come:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(data))
Memorizza la stringa base64 del risultato nel codice sorgente, ad esempio come file const.
Decodificarlo è solo una chiamata di funzione:
const imgBase64 = "<insert base64 string here>"
data, err := base64.StdEncoding.DecodeString(imgBase64) // data is of type []byte
Conservazione come citato string
Più efficiente dell'archiviazione come base64, ma potrebbe essere più lungo nel codice sorgente archiviare la stringa letterale tra virgolette dei dati binari. Possiamo ottenere la forma quotata di qualsiasi stringa utilizzando la strconv.Quote()funzione:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(strconv.Quote(string(data))
Per i dati binari contenenti valori da 0 a 64, ecco come apparirebbe l'output (provalo su Go Playground ):
"\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"
(Nota che strconv.Quote()aggiunge e antepone una virgoletta.)
Puoi utilizzare direttamente questa stringa tra virgolette nel codice sorgente, ad esempio:
const imgdata = "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"
È pronto per l'uso, non è necessario decodificarlo; l'annullamento delle quotazioni viene eseguito dal compilatore Go, in fase di compilazione.
Puoi anche memorizzarlo come una fetta di byte se ne hai bisogno in questo modo:
var imgdata = []byte("\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?")