少数派报告----Edward's Webblog

Some raw thought.

Download as .zip Download as .tar.gz View on GitHub
18 February 2021

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 *.txt

embed指令必须在紧邻变量声明的上一行,在指令和变量声明之间仅允许空行或注释。

当然,内嵌的文件类型也不限于文本,例如:

tags: