Go by Example: Embed Directive

//go:embed is a compiler directive that allows programs to include arbitrary files/folders in the binary. Read more about go directive here.

package main

If no exported identifiers is directly used from embed package, you can add an underscore _ before the package name. In this example, we simply import it as we need to use the embed.FS type from the package.

import (
    //_ "embed"
    "embed"
)

Since one file is defined after the directive, the compiler will only include this single file, followed by variable single_file_string to access as string type.

//go:embed example_folder/single_file.txt
var single_file_string string

Here is a similar example but include single file as []byte.

//go:embed example_folder/single_file.txt
var single_file_byte []byte

We can also embed multiple files or even folders with wildcard.

//go:embed example_folder/single_file.txt
//go:embed example_folder/*.hash
var folder_FS embed.FS
func main() {

Print out content of example_single_file.txt as string.

    print(single_file_string)

Now handle []byte.

    print(string(single_file_byte))

Retrieve file(s) matching *.hash pattern by reading from variable folder_FS first, then print out.

    hash_file1 := "example_folder/multi_file1.hash"
    hash_file2 := "example_folder/multi_file2.hash"
    hash_content1, _ := folder_FS.ReadFile(hash_file1)
    hash_content2, _ := folder_FS.ReadFile(hash_file2)
    print(string(hash_content1))
    print(string(hash_content2))
}

Use these commands to run the example. (Note: due to limitation on go playground, this example can only be run on your local machine.)

$ mkdir -p example_folder
$ echo "hello go" > example_folder/single_file.txt
$ echo "123" > example_folder/multi_file1.hash
$ echo "456" > example_folder/multi_file2.hash
$ go run embed-directive.go
hello go
hello go
123
456

Next example: Testing and Benchmarking.