Osadzanie plików tekstowych
Jeśli mówimy o plikach tekstowych, można je łatwo osadzić w samym kodzie źródłowym. Po prostu użyj cudzysłowów wstecz, aby zadeklarować string
literał w następujący sposób:
const html = `
<html>
<body>Example embedded HTML content.</body>
</html>
`
// Sending it:
w.Write([]byte(html)) // w is an io.Writer
Wskazówka dotycząca optymalizacji:
Ponieważ w większości przypadków wystarczy zapisać zasób do pliku io.Writer
, możesz również zapisać wynik []byte
konwersji:
var html = []byte(`
<html><body>Example...</body></html>
`)
// Sending it:
w.Write(html) // w is an io.Writer
Jedyną rzeczą, na którą musisz uważać, jest to, że surowe literały ciągów nie mogą zawierać znaku cudzysłowu (`). Surowe literały ciągów nie mogą zawierać sekwencji (w przeciwieństwie do zinterpretowanych literałów ciągów), więc jeśli tekst, który chcesz osadzić, zawiera cudzysłowy wsteczne, musisz przerwać nieprzetworzony literał ciągu i połączyć cudzysłowy jako zinterpretowane literały ciągów, jak w tym przykładzie:
var html = `<p>This is a back quote followed by a dot: ` + "`" + `.</p>`
Nie ma to wpływu na wydajność, ponieważ te konkatenacje będą wykonywane przez kompilator.
Osadzanie plików binarnych
Przechowywanie jako kawałek bajtu
W przypadku plików binarnych (np. Obrazów) najbardziej zwartym (pod względem wynikowego natywnego pliku binarnego) i najbardziej wydajnym byłoby umieszczenie zawartości pliku []byte
w kodzie źródłowym. Może to zostać wygenerowane przez zewnętrzne biblioteki toos / biblioteki, takie jak go-bindata .
Jeśli nie chcesz do tego używać biblioteki innej firmy, oto prosty fragment kodu, który odczytuje plik binarny i wyświetla kod źródłowy Go, który deklaruje zmienną typu, []byte
która zostanie zainicjowana z dokładną zawartością pliku:
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("}")
Przykładowe dane wyjściowe, jeśli plik zawierałby bajty od 0 do 16 (spróbuj w Go Playground ):
var imgdata = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
Przechowywanie jako base64 string
Jeśli plik nie jest „zbyt duży” (większość obrazów / ikon kwalifikuje się), istnieją również inne przydatne opcje. Możesz przekonwertować zawartość pliku na Base64 string
i zapisać ją w kodzie źródłowym. Podczas uruchamiania aplikacji ( func init()
) lub w razie potrzeby możesz zdekodować ją do oryginalnej []byte
treści. Go ma dobre wsparcie dla kodowania Base64 w encoding/base64
pakiecie.
Konwersja pliku (binarnego) do formatu base64 string
jest tak prosta, jak:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(data))
Przechowuj wynikowy ciąg base64 w swoim kodzie źródłowym, np. Jako plik const
.
Dekodowanie to tylko jedno wywołanie funkcji:
const imgBase64 = "<insert base64 string here>"
data, err := base64.StdEncoding.DecodeString(imgBase64) // data is of type []byte
Przechowywanie zgodnie z notowaniem string
Bardziej wydajne niż przechowywanie jako base64, ale może być dłuższe w kodzie źródłowym, jest przechowywanie cytowanego literału ciągu danych binarnych. Możemy otrzymać cytowaną postać dowolnego ciągu za pomocą strconv.Quote()
funkcji:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(strconv.Quote(string(data))
W przypadku danych binarnych zawierających wartości od 0 do 64 tak wyglądałoby dane wyjściowe (wypróbuj na 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:;<=>?"
(Zwróć uwagę, że strconv.Quote()
dołącza i poprzedza cudzysłów).
Możesz bezpośrednio użyć tego cytowanego ciągu w swoim kodzie źródłowym, na przykład:
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:;<=>?"
Jest gotowy do użycia, nie trzeba go dekodować; usuwanie cytatów jest wykonywane przez kompilator Go w czasie kompilacji.
Możesz również zapisać go jako fragment bajtu, jeśli potrzebujesz go w ten sposób:
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:;<=>?")