pemrograman

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

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.

comments powered by Disqus