Incrustar archivos de texto
Si hablamos de archivos de texto, se pueden incrustar fácilmente en el código fuente. Simplemente use las comillas inversas para declarar el string
literal de esta manera:
const html = `
<html>
<body>Example embedded HTML content.</body>
</html>
`
// Sending it:
w.Write([]byte(html)) // w is an io.Writer
Consejo de optimización:
Dado que la mayoría de las veces solo necesitará escribir el recurso en un io.Writer
, también puede almacenar el resultado de una []byte
conversión:
var html = []byte(`
<html><body>Example...</body></html>
`)
// Sending it:
w.Write(html) // w is an io.Writer
Lo único con lo que debe tener cuidado es que los literales de cadena sin formato no pueden contener el carácter de comillas inversas (`). Los literales de cadena sin formato no pueden contener secuencias (a diferencia de los literales de cadena interpretados), por lo que si el texto que desea incrustar contiene comillas inversas, debe romper el literal de cadena sin procesar y concatenar comillas inversas como literales de cadena interpretados, como en este ejemplo:
var html = `<p>This is a back quote followed by a dot: ` + "`" + `.</p>`
El rendimiento no se ve afectado, ya que el compilador ejecutará estas concatenaciones.
Incrustar archivos binarios
Almacenar como un segmento de bytes
Para archivos binarios (por ejemplo, imágenes) más compacto (con respecto al binario nativo resultante) y más eficiente sería tener el contenido del archivo como []byte
en su código fuente. Esto puede ser generado por bibliotecas / herramientas de terceros como go-bindata .
Si no desea utilizar una biblioteca de terceros para esto, aquí hay un fragmento de código simple que lee un archivo binario y genera el código fuente de Go que declara una variable de tipo []byte
que se inicializará con el contenido exacto del archivo:
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("}")
Salida de ejemplo si el archivo contendría bytes de 0 a 16 (pruébelo en Go Playground ):
var imgdata = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
Almacenar como base64 string
Si el archivo no es "demasiado grande" (la mayoría de las imágenes / iconos cumplen los requisitos), también existen otras opciones viables. Puede convertir el contenido del archivo a Base64 string
y almacenarlo en su código fuente. Al iniciar la aplicación ( func init()
) o cuando sea necesario, puede decodificarla con el []byte
contenido original . Go tiene un buen soporte para la codificación Base64 en el encoding/base64
paquete.
Convertir un archivo (binario) a base64 string
es tan simple como:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(data))
Almacene la cadena resultante en base64 en su código fuente, por ejemplo, como un archivo const
.
Decodificarlo es solo una llamada de función:
const imgBase64 = "<insert base64 string here>"
data, err := base64.StdEncoding.DecodeString(imgBase64) // data is of type []byte
Almacenando como cotizado string
Más eficiente que almacenar como base64, pero puede ser más largo en el código fuente es almacenar el literal de cadena entre comillas de los datos binarios. Podemos obtener la forma citada de cualquier cadena usando la strconv.Quote()
función:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(strconv.Quote(string(data))
Para datos binarios que contienen valores desde 0 hasta 64, así es como se vería la salida (pruébelo en 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:;<=>?"
(Tenga en cuenta que le strconv.Quote()
añade y antepone una comilla).
Puede utilizar directamente esta cadena entre comillas en su código fuente, por ejemplo:
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:;<=>?"
Está listo para usar, no es necesario decodificarlo; la eliminación de comillas la realiza el compilador Go, en el momento de la compilación.
También puede almacenarlo como un segmento de bytes si lo necesita así:
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:;<=>?")