Kodeloka
  1. Kodeloka
  2. Kelas Golang
  3. Materi

Domain 11 · 6 bab

Golang Embed

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.

💡 Keuntungan Utama Go Embed:
  • 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!")
}

Praktik dan kuis bab ini di kelas interaktif →

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.

📌 Contoh Kode Asli Go:
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))
}

Praktik dan kuis bab ini di kelas interaktif →

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.

⚠️ Mengapa []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")
}

Praktik dan kuis bab ini di kelas interaktif →

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)
	}
}

Praktik dan kuis bab ini di kelas interaktif →

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.
⚠️ Aturan Dot Files (File Tersembunyi):

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")
}

Praktik dan kuis bab ini di kelas interaktif →

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.

🚀 Keuntungan Deployment:

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")
}

Praktik dan kuis bab ini di kelas interaktif →