Add some improvements

Signed-off-by: peterzhu1992 <peterzhu1992@gmail.com>
This commit is contained in:
peterzhu1992 2022-05-19 19:41:35 -04:00
parent 40a68991d7
commit 40ac3bff37
No known key found for this signature in database
GPG Key ID: 97BC41A568652A72
7 changed files with 41 additions and 33 deletions

View File

@ -20,7 +20,6 @@ Structs
Methods
Interfaces
Struct Embedding
Embed Directive
Generics
Errors
Goroutines
@ -66,6 +65,7 @@ Line Filters
File Paths
Directories
Temporary Files and Directories
Embed Directive
Testing and Benchmarking
Command-Line Arguments
Command-Line Flags

View File

@ -1,51 +1,45 @@
// 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.
// `//go:embed` is a compiler directive that allows programs to include arbitrary
// files/folders in the binary. Read more about go directive
// [here](https://dave.cheney.net/2018/01/08/gos-hidden-pragmas).
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.
// 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 embed-directive.sh
//go:embed example_folder/single_file.txt
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
//go:embed example_folder/single_file.txt
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
//go:embed example_folder/single_file.txt
//go:embed example_folder/*.hash
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 `example_single_file.txt` as `string`.
print(single_file_string)
// Print out the content of `embed-directive.sh` as `[]byte`.
println(string(single_file_byte))
// Now handle `[]byte`.`
print(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))
// Retrieve the file(s) matching `*.hash` pattern by reading from `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))
}

View File

@ -1,2 +1,2 @@
10914400b16498094a1a876856181673c3fcdfe0
gk3Zh5Sx8rV
33356517e565ff2d1f9d7f935012a326e8f5b3ea
yTsQsPe9jth

View File

@ -1,4 +1,15 @@
# 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

View File

@ -0,0 +1 @@
123

View File

@ -0,0 +1 @@
456

View File

@ -0,0 +1 @@
hello go