gobyexample/examples/embed-directive/embed-directive.go
peterzhu1992 f900918c93
Add embed-directive example and rename embedding to struct-embedding
Signed-off-by: peterzhu1992 <peterzhu1992@gmail.com>
2022-05-17 01:20:06 -04:00

52 lines
2.1 KiB
Go

// Starting in Go version 1.16+, Go supports use of `//go:embed`
// which is a directive to embed files and folders into
// the application binary by the compiler.
// Since Go does not have preprocessor or macros like C type of languages,
// `pragmas/directives` are implemented by the compiler as comments `//`.
// Using `//go:embed` tells the compiler to include arbitrary files/folders in binary.
package main
// If you are not using any exported identifiers from `embed` package directly,
// you can add an underscore `_` before the package name, ask Go to import `embed`
// without directly using it, like this: `_ "embed"`. In this example, we remove the
// underscore as we need to use the `embed.FS` type from the package.
import (
"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 embed-directive.sh
var single_file_string string
// Here is a similar example but include single file as `[]byte`.
// Note that `//go:embed` can only be used in package level,
// define it in any function will result in error.
//go:embed embed-directive.sh
var single_file_byte []byte
// We can also embed multiple files or even folders with wildcard.
// Since Go resolves these files and folders during compile time, we have to use the files in
// current working directory as examples. In practice, you can embed files with `"//go:embed /path/to/folder"`
// or with another example `"//go:embed /path/to/folder/*"`. You can add multiple `//go:embed` before defining a variable.
//go:embed *.hash
//go:embed embed-directive.sh
var folder_FS embed.FS
func main() {
// Print out the content of `embed-directive.sh` as `string`.
println(single_file_string)
// Print out the content of `embed-directive.sh` as `[]byte`.
println(string(single_file_byte))
// Print out the content of `embed-directive.hash` by reading the file from `folder_FS` first,
// then print out the content.
hash_file := "embed-directive.hash"
hash_content, _ := folder_FS.ReadFile(hash_file)
println(string(hash_content))
}