Incorporação de arquivos de texto
Se estamos falando de arquivos de texto, eles podem ser facilmente incorporados ao próprio código-fonte. Basta usar as aspas para declarar o stringliteral assim:
const html = `
<html>
<body>Example embedded HTML content.</body>
</html>
`
// Sending it:
w.Write([]byte(html)) // w is an io.Writer
Dica de otimização:
Como na maioria das vezes você só precisa gravar o recurso em um io.Writer, você também pode armazenar o resultado de uma []byteconversão:
var html = []byte(`
<html><body>Example...</body></html>
`)
// Sending it:
w.Write(html) // w is an io.Writer
A única coisa com a qual você deve ter cuidado é que os literais de string bruta não podem conter o caractere de aspas invertidas (`). Literais de string bruta não podem conter sequências (ao contrário dos literais de string interpretados), portanto, se o texto que você deseja incorporar contiver aspas, você terá que quebrar o literal de string bruto e concatenar aspas invertidas como literais de string interpretados, como neste exemplo:
var html = `<p>This is a back quote followed by a dot: ` + "`" + `.</p>`
O desempenho não é afetado, pois essas concatenações serão executadas pelo compilador.
Incorporando arquivos binários
Armazenando como uma fatia de byte
Para arquivos binários (por exemplo, imagens) mais compactos (em relação ao binário nativo resultante) e mais eficiente seria ter o conteúdo do arquivo como um []byteem seu código-fonte. Isso pode ser gerado por toos / bibliotecas de terceiros, como go-bindata .
Se você não quiser usar uma biblioteca de terceiros para isso, aqui está um snippet de código simples que lê um arquivo binário e gera o código-fonte Go que declara uma variável do tipo []byteque será inicializada com o conteúdo exato do arquivo:
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("}")
Exemplo de saída se o arquivo contiver bytes de 0 a 16 (experimente no Go Playground ):
var imgdata = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
Armazenando como base64 string
Se o arquivo não for "muito grande" (a maioria das imagens / ícones se qualificam), existem outras opções viáveis também. Você pode converter o conteúdo do arquivo em Base64 stringe armazená-lo em seu código-fonte. Na inicialização do aplicativo ( func init()) ou quando necessário, você pode decodificá-lo para o []byteconteúdo original . Go tem bom suporte para codificação Base64 no encoding/base64pacote.
Converter um arquivo (binário) em base64 stringé tão simples quanto:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(data))
Armazene a string de resultado base64 em seu código-fonte, por exemplo, como um const.
Decodificá-lo é apenas uma chamada de função:
const imgBase64 = "<insert base64 string here>"
data, err := base64.StdEncoding.DecodeString(imgBase64) // data is of type []byte
Armazenando conforme citado string
Mais eficiente do que armazenar como base64, mas pode ser mais longo no código-fonte é armazenar a string literal entre aspas dos dados binários. Podemos obter a forma entre aspas de qualquer string usando a strconv.Quote()função:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(strconv.Quote(string(data))
Para dados binários contendo valores de 0 a 64, esta é a aparência da saída (experimente no 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:;<=>?"
(Observe que strconv.Quote()acrescenta e adiciona uma aspa.)
Você pode usar diretamente esta string entre aspas em seu código-fonte, por exemplo:
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á pronto para usar, não há necessidade de decodificá-lo; o unquoting é feito pelo compilador Go, em tempo de compilação.
Você também pode armazená-lo como uma fatia de byte, caso precise desta forma:
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:;<=>?")