Incorporation de fichiers texte
Si nous parlons de fichiers texte, ils peuvent facilement être intégrés dans le code source lui-même. Utilisez simplement les guillemets pour déclarer le string
littéral comme ceci:
const html = `
<html>
<body>Example embedded HTML content.</body>
</html>
`
// Sending it:
w.Write([]byte(html)) // w is an io.Writer
Conseil d'optimisation:
Comme la plupart du temps, vous n'aurez qu'à écrire la ressource dans un io.Writer
, vous pouvez également stocker le résultat d'une []byte
conversion:
var html = []byte(`
<html><body>Example...</body></html>
`)
// Sending it:
w.Write(html) // w is an io.Writer
La seule chose à laquelle vous devez faire attention est que les littéraux de chaîne bruts ne peuvent pas contenir le caractère guillemet arrière (`). Les littéraux de chaîne bruts ne peuvent pas contenir de séquences (contrairement aux littéraux de chaîne interprétés), donc si le texte que vous souhaitez incorporer contient des guillemets, vous devez casser le littéral de chaîne brute et concaténer les guillemets arrière comme des littéraux de chaîne interprétés, comme dans cet exemple:
var html = `<p>This is a back quote followed by a dot: ` + "`" + `.</p>`
Les performances ne sont pas affectées, car ces concaténations seront exécutées par le compilateur.
Incorporation de fichiers binaires
Stockage sous forme de tranche d'octet
Pour les fichiers binaires (par exemple des images), le plus compact (en ce qui concerne le binaire natif résultant) et le plus efficace serait d'avoir le contenu du fichier comme un []byte
dans votre code source. Cela peut être généré par des toos / bibliothèques tiers comme go-bindata .
Si vous ne souhaitez pas utiliser une bibliothèque tierce pour cela, voici un simple extrait de code qui lit un fichier binaire et génère un code source Go qui déclare une variable de type []byte
qui sera initialisée avec le contenu exact du fichier:
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("}")
Exemple de sortie si le fichier contiendrait des octets de 0 à 16 (essayez-le sur le Go Playground ):
var imgdata = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
Stockage en base64 string
Si le fichier n'est pas «trop volumineux» (la plupart des images / icônes sont admissibles), il existe également d'autres options viables. Vous pouvez convertir le contenu du fichier en Base64 string
et le stocker dans votre code source. Au démarrage de l'application ( func init()
) ou si nécessaire, vous pouvez le décoder dans le []byte
contenu d' origine . Go a un bon support pour l'encodage Base64 dans le encoding/base64
package.
La conversion d'un fichier (binaire) en base64 string
est aussi simple que:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(data))
Stockez la chaîne résultat base64 dans votre code source, par exemple sous forme de fichier const
.
Le décoder est juste un appel de fonction:
const imgBase64 = "<insert base64 string here>"
data, err := base64.StdEncoding.DecodeString(imgBase64) // data is of type []byte
Stockage comme indiqué string
Plus efficace que le stockage en base64, mais peut être plus long dans le code source, il stocke le littéral de chaîne entre guillemets des données binaires. Nous pouvons obtenir la forme citée de n'importe quelle chaîne en utilisant la strconv.Quote()
fonction:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(strconv.Quote(string(data))
Pour les données binaires contenant des valeurs de 0 à 64, voici à quoi ressemblerait la sortie (essayez-la sur le 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:;<=>?"
(Notez que cela strconv.Quote()
ajoute et ajoute un guillemet.)
Vous pouvez utiliser directement cette chaîne entre guillemets dans votre code source, par exemple:
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:;<=>?"
Il est prêt à l'emploi, pas besoin de le décoder; la suppression des guillemets est effectuée par le compilateur Go, au moment de la compilation.
Vous pouvez également le stocker sous forme de tranche d'octets si vous en avez besoin comme ça:
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:;<=>?")