136. Pengenalan Package Embed & Directive //go:embed
Fitur bawaan Go 1.16+ untuk mengemas file statis (HTML, CSS, SQL, Config) langsung ke dalam binary executable.
Apa itu Golang Embed?
Sejak Go 1.16, Go menyediakan package bawaan bernama embed dan compiler directive //go:embed. Fitur ini memungkinkan kita untuk mengemas file atau folder fisik ke dalam binary file executable Go secara otomatis pada saat proses kompilasi.
- Single Binary Deployment: Aplikasi dan file statisnya (HTML, CSS, gambar, SQL script) dikemas dalam 1 file binary.
- Tanpa File Dependency: Tidak perlu khawatir file hilang atau path salah saat aplikasi di-deploy ke server.
- Performa Tinggi: File dibaca langsung dari memori tanpa pembacaan disk I/O berulang pada runtime.
Aturan Sintaks Directive //go:embed:
import _ "embed" // Wajib import jika variabel bertipe string/[]byte //go:embed version.txt var version string
Contoh program
package main
import (
_ "embed"
"fmt"
)
// Contoh penggunaan directive embed untuk variabel string
// (Pada simulasi ini kita deklarasikan nilai string langsung)
var version = "v1.5.0-production"
func main() {
fmt.Println("=== GOLANG EMBED DEMO ===")
fmt.Println("Versi Aplikasi (embedded):", version)
fmt.Println("Keuntungan: File terkemas langsung di dalam biner Go!")
}
137. Embed File ke Variable String
Membaca isi file teks tunggal langsung ke dalam variabel bertipe string.
Embed File ke Variable String
Jika file yang di-embed merupakan file teks (seperti .txt, .json, .html, atau .sql), kita bisa mendeklarasikan variabel berjenis string langsung tepat di bawah directive //go:embed.
package main
import (
_ "embed"
"fmt"
)
//go:embed secret.txt
var secretMessage string
func main() {
fmt.Println("Pesan Rahasia:", secretMessage)
}
Contoh program
package main
import "fmt"
func main() {
// Simulasi variabel yang di-embed dari file secret.txt
var secretMessage = "Go-Embed-String-Content-12345"
fmt.Println("=== EMBED STRING ===")
fmt.Println("Isi File:", secretMessage)
fmt.Println("Panjang karakter:", len(secretMessage))
}
138. Embed File ke Variable Byte Slice ([]byte)
Meng-embed file biner (gambar, gambar PNG, audio, PDF) ke dalam variabel slice of bytes.
Embed File ke Byte Slice ([]byte)
Untuk file non-teks atau biner seperti gambar (.png, .jpg), file audio, atau dokumen PDF, tipe data yang paling tepat adalah []byte.
String di Go imutabel dan berasumsi UTF-8. Tipe []byte mempertahankan data mentah biner tanpa alokasi memori tambahan atau konversi karakter.
Contoh program
package main
import "fmt"
func main() {
// Simulasi data biner gambar yang di-embed ke []byte
var logoBytes = []byte{0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}
fmt.Println("=== EMBED BYTE SLICE ===")
fmt.Printf("Header PNG Bytes: %X
", logoBytes)
fmt.Println("Ukuran Byte:", len(logoBytes), "bytes")
}
139. Embed Multiple Files dengan embed.FS
Meng-embed banyak file sekaligus ke dalam struktur Virtual File System menggunakan tipe embed.FS.
Tipe embed.FS (File System)
Saat kita butuh meng-embed banyak file sekaligus (seperti seluruh isi folder files/ atau templates/), kita menggunakan tipe embed.FS.
import "embed" //go:embed files/*.txt var files embed.FS
Kita dapat membaca isi file dengan method files.ReadFile("path/file.txt") atau files.ReadDir("path").
Contoh program
package main
import "fmt"
func main() {
// Simulasi pembacaan virtual file system embed.FS
mockFS := map[string]string{
"files/a.txt": "Isi File A",
"files/b.txt": "Isi File B",
}
fmt.Println("=== EMBED MULTIPLE FILES (embed.FS) ===")
for path, content := range mockFS {
fmt.Printf("File: %s -> Content: %s
", path, content)
}
}
140. Path Matcher & Wildcard Pattern pada //go:embed
Aturan matching pola pencocokan direktori dan perilaku pencarian file tersembunyi.
Pola Matching pada //go:embed
//go:embed files/*.txt: Meng-embed semua file ekstensi .txt di folder files.//go:embed files: Meng-embed seluruh direktori files beserta sub-folder di dalamnya.
Secara default, wildcard (*) di //go:embed TIDAK meng-embed file yang diawali titik (.) atau garis bawah (_) kecuali disebutkan secara eksplisit.
Contoh program
package main
import "fmt"
func main() {
fmt.Println("=== PATH MATCHER ATURAN ===")
fmt.Println("1. //go:embed path/* -> cocok dengan semua file di folder")
fmt.Println("2. File .env atau .gitignore diabaikan oleh '*' kecuali ditulis //go:embed path/.env")
}
141. Hasil Embed pada Process Compile & Single Binary Deployment
Mekanisme penggabungan aset fisik menjadi executable tunggal dan keuntungannya di server produksi.
Single Binary Executable
Saat menjalankan perintah go build, Go compiler mengambil file fisik dari disk dan memasukkannya langsung ke bagian segmen data binary executable.
Aplikasi web Go (HTML template + CSS + JS) dapat di-copy ke server Linux dalam bentuk 1 file binary tunggal tanpa butuh folder templates/ terpisah di server!
Contoh program
package main
import "fmt"
func main() {
fmt.Println("==========================================")
fmt.Println(" SUCCESS: GOLANG EMBED MODULE COMPLETED! ")
fmt.Println("==========================================")
fmt.Println("1. //go:embed string -> File teks")
fmt.Println("2. //go:embed []byte -> File biner")
fmt.Println("3. //go:embed embed.FS -> Multi-file/Folder")
}