From 40ac3bff376de4de943a60dce15b9f36303f9729 Mon Sep 17 00:00:00 2001 From: peterzhu1992 Date: Thu, 19 May 2022 19:41:35 -0400 Subject: [PATCH] Add some improvements Signed-off-by: peterzhu1992 --- examples.txt | 2 +- examples/embed-directive/embed-directive.go | 52 ++++++++----------- examples/embed-directive/embed-directive.hash | 4 +- examples/embed-directive/embed-directive.sh | 13 ++++- .../example_folder/multi_file1.hash | 1 + .../example_folder/multi_file2.hash | 1 + .../example_folder/single_file.txt | 1 + 7 files changed, 41 insertions(+), 33 deletions(-) create mode 100644 examples/embed-directive/example_folder/multi_file1.hash create mode 100644 examples/embed-directive/example_folder/multi_file2.hash create mode 100644 examples/embed-directive/example_folder/single_file.txt diff --git a/examples.txt b/examples.txt index fa033a4..5c22a2a 100644 --- a/examples.txt +++ b/examples.txt @@ -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 diff --git a/examples/embed-directive/embed-directive.go b/examples/embed-directive/embed-directive.go index 964d4b0..2424519 100644 --- a/examples/embed-directive/embed-directive.go +++ b/examples/embed-directive/embed-directive.go @@ -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)) } diff --git a/examples/embed-directive/embed-directive.hash b/examples/embed-directive/embed-directive.hash index 6919f0c..f749cc5 100644 --- a/examples/embed-directive/embed-directive.hash +++ b/examples/embed-directive/embed-directive.hash @@ -1,2 +1,2 @@ -10914400b16498094a1a876856181673c3fcdfe0 -gk3Zh5Sx8rV +33356517e565ff2d1f9d7f935012a326e8f5b3ea +yTsQsPe9jth diff --git a/examples/embed-directive/embed-directive.sh b/examples/embed-directive/embed-directive.sh index ac19f3a..5174a03 100644 --- a/examples/embed-directive/embed-directive.sh +++ b/examples/embed-directive/embed-directive.sh @@ -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 diff --git a/examples/embed-directive/example_folder/multi_file1.hash b/examples/embed-directive/example_folder/multi_file1.hash new file mode 100644 index 0000000..190a180 --- /dev/null +++ b/examples/embed-directive/example_folder/multi_file1.hash @@ -0,0 +1 @@ +123 diff --git a/examples/embed-directive/example_folder/multi_file2.hash b/examples/embed-directive/example_folder/multi_file2.hash new file mode 100644 index 0000000..8d38505 --- /dev/null +++ b/examples/embed-directive/example_folder/multi_file2.hash @@ -0,0 +1 @@ +456 diff --git a/examples/embed-directive/example_folder/single_file.txt b/examples/embed-directive/example_folder/single_file.txt new file mode 100644 index 0000000..606d597 --- /dev/null +++ b/examples/embed-directive/example_folder/single_file.txt @@ -0,0 +1 @@ +hello go