Pengenalan Embed Package
Sejak Golang merilis versi 1.16 terdapat fitur baru dengan nama Embed. Package embed ini adalah fitur yang mempermudah membuka isi file pada saat compile time secara otomatis dimasukkan isi file tersebut ke dalam variabel yang sudah kita definisikan. Lebih lengkapnya bisa lihat di sini.
Cara Embed File
Ketika kita akan melakukan Embed file ke dalam variabel kita bisa mengimport package embed
terlebih dahulu selanjutnya kita bisa menambahkan komentar //go:embed
diikuti dengan filenya diatas variabel yang kita tuju. Variabel yang dituju tersebut nanti secara otomatis akan berisi konten file yang kita inginkan ketika kode golang dikompilasi. Variabel yang dituju tidak bisa disimpan di dalam suatu fungsi.
Embed File ke String
Memasukkan isi file ke dalam variabel (Embed) secara otomatis isi file tersebut akan dibaca sebagai teks dan memasukkan ke dalam variabel tersebut.
Sebelum kita melakukan implementasi kita coba buat folder terlebih dahulu dengan nama learn-golang-embed
lalu lakukan juga inisialisasi go mod
dengan perintah dibawah ini
go mod init github.com/santekno/learn-golang-embed
Setelah itu kita buat file txt
yang bernama version.txt
yang mana ini nanti akan kita baca oleh program embed yang akan kita coba kali ini dengan isi version, misalkan seperti ini
v1.0.0
Setelah itu kita coba buat file main.go
dan isi file main dengan kode program dibawah ini.
package main
import (
_ "embed"
"fmt"
)
//go:embed version.txt
var version string
func main() {
fmt.Println(version)
}
Maka, ketika kita jalankan akan menghasilkan ini.
➜ learn-golang-embed git:(main) ✗ go run main.go
v1.0.0
Embed File ke dalam Byte
Sekarang kita coba Embed ke dalam tipe yang lain yaitu []byte. Selain ke dalam tipe data string, embed ini juga bisa digunakan ke dalam beberapa tipe. Ini sangat cocok sekali jika kita ingin melakukan embed file dalam bentuk binary, misalkan gambar dan lainnya.
package main
import (
_ "embed"
"io/fs"
"os"
)
//go:embed logo.png
var logo []byte
func main() {
err := os.WriteFile("logo_new.png", logo, fs.ModePerm)
if err != nil {
panic(err)
}
}
Ketika dijalankan akan membuat file baru dengan nama logo_new.png
dengan gambar yang sama seperti logo.png
Embed Multiple Files
Biasanya kita juga ingin melakukan embed beberapa file sekaligus untuk kebutuhan kita. Hal ini bisa kita lakukan dengan menggunakan embed package dengan menambahkan komentar //go:embed
lebih dari satu baris dan variabel-nya itu bisa kita gunakan tipe data embed.FS
.
Kita buat folder file
dengan memiliki 3 file dengan nama a.txt
, b.txt
dan c.txt
dengan isi masing2 file AAA
, BBB
, CCC
atau sesuaikan saja dengan keinginan teman-teman.
package main
import (
"embed"
_ "embed"
"fmt"
)
//go:embed files/a.txt
//go:embed files/b.txt
//go:embed files/c.txt
var files embed.FS
func main() {
a, _ := files.ReadFile("files/a.txt")
fmt.Println(string(a))
b, _ := files.ReadFile("files/b.txt")
fmt.Println(string(b))
c, _ := files.ReadFile("files/c.txt")
fmt.Println(string(c))
}
Path Matcher
Selain manual satu per satu file yang akan dibaca, maka kita juga bisa menggunakan patch matcher untuk membaca multiple file yang kita inginkan. Ini bisa kita implementasikan ketika kita memiliki kebutuhan membuka file dengan memiliki pola jenis file yang kita baca. Bagaimana caranya? kia perlu menggunakan path matcher
pada package fungsi path.Match
package main
import (
"embed"
_ "embed"
"fmt"
)
//go:embed files/*.txt
var path embed.FS
func main() {
dir, _ := path.ReadDir("files")
for _, entry := range dir {
if !entry.IsDir() {
fmt.Println(entry.Name())
content, _ := path.ReadFile("files/" + entry.Name())
fmt.Println("Content: ", string(content))
}
}
}
Ketika kita jalankan akan menghasilkan seperti ini.
➜ learn-golang-embed git:(main) ✗ go run main.go
a.txt
Content: AAA
b.txt
Content: BBB
c.txt
Content: CCC
Hasil Compile Embed
Perlu kita ketahui bahwa hasil dari embed yang dilakukan oleh package embed adalah permanent dan data file yang dibaca akan disimpan ke dalam binary file golang yang telah kita buat. Maka embed
package ini tidak secara realtime membaca file yang ada diluar sehingga jika kita sudah melakukan compile dan memiliki binary file golang, maka kita tidak butuh lagi file externalnya dan jika file eksternalnya kita ubah maka isi variabel tidak akan berubah lagi, sehingga perlu melakukan re-compile.