Pengenalan Dan Implementasi Golang Embed
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
1go mod init github.com/santekno/learn-golang-embedSetelah 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
1v1.0.0Setelah itu kita coba buat file main.go dan isi file main dengan kode program dibawah ini.
1package main
2
3import (
4 _ "embed"
5 "fmt"
6)
7
8//go:embed version.txt
9var version string
10
11func main() {
12 fmt.Println(version)
13}Maka, ketika kita jalankan akan menghasilkan ini.
1➜ learn-golang-embed git:(main) ✗ go run main.go
2v1.0.0Embed 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.
1package main
2
3import (
4 _ "embed"
5 "io/fs"
6 "os"
7)
8
9//go:embed logo.png
10var logo []byte
11
12func main() {
13 err := os.WriteFile("logo_new.png", logo, fs.ModePerm)
14 if err != nil {
15 panic(err)
16 }
17}logo_new.png dengan gambar yang sama seperti logo.pngEmbed 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.
1package main
2
3import (
4 "embed"
5 _ "embed"
6 "fmt"
7)
8
9//go:embed files/a.txt
10//go:embed files/b.txt
11//go:embed files/c.txt
12var files embed.FS
13
14func main() {
15 a, _ := files.ReadFile("files/a.txt")
16 fmt.Println(string(a))
17
18 b, _ := files.ReadFile("files/b.txt")
19 fmt.Println(string(b))
20
21 c, _ := files.ReadFile("files/c.txt")
22 fmt.Println(string(c))
23}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
1package main
2
3import (
4 "embed"
5 _ "embed"
6 "fmt"
7)
8
9//go:embed files/*.txt
10var path embed.FS
11
12func main() {
13 dir, _ := path.ReadDir("files")
14 for _, entry := range dir {
15 if !entry.IsDir() {
16 fmt.Println(entry.Name())
17 content, _ := path.ReadFile("files/" + entry.Name())
18 fmt.Println("Content: ", string(content))
19 }
20 }
21}1➜ learn-golang-embed git:(main) ✗ go run main.go
2a.txt
3Content: AAA
4b.txt
5Content: BBB
6c.txt
7Content: CCCHasil 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.