go 1.16 embed标签初探
by
go1.6版本昨天发布了,与1.15版本相隔了半年。这次的更新引入了新的embed包,通过//go:embed 指令可以在编译时内嵌文件。用法如下:
package main
import _ "embed"
//go:embed hello.txt
var s string
func main() {
print(s)
}在同目录下创建hello.txt文件,
hello world, it’s the first workday.
编译执行,可以看到以下输出:

官方文档给出的说明是引入“embed”包的go源文件可以使用//go:embed指令初始化一个string类型变量、[]byte, 或者从包所在目录或子目录读取文件内容的FS(一个只读的文件集合)。其中变量的类型必须是字符串、字节切片或者FS(或FS的别名)。
看来文件内容不仅可以是字符串,还可以是[]byte的切片。我们看以下例子:
package main
import _ "embed"
//go:embed hello.txt
var b []byte
func main() {
print(string(b))
}hello.txt文件内容不变。执行go run myEmbedSlice.go结果如下:

可以看到输出了相同的结果。
接下来,用读取文件到FS的方式代码如下:
package main
import "embed"
//go:embed hello.txt
var f embed.FS
func main() {
data, _ := f.ReadFile("hello.txt")
print(string(data))
}hello.txt内容依然不变,看看运行结果:

在变量声明上方的go://embed指令指定了要内嵌的文件,文件名可以支持模式匹配,例如:
go://embed *.txtembed指令必须在紧邻变量声明的上一行,在指令和变量声明之间仅允许空行或注释。
当然,内嵌的文件类型也不限于文本,例如:
-
.gob
-
*.tmpl
关于内嵌的详细内容可以参见官方文档和Carl Johnson的文章: How to Use Go embed