go embed包1.16版本引入。
引入方式
import embed
概述
embed包提供对嵌入在运行中的go程序中的文件的访问。
导入“embed”的go源文件可以使用//go:embed指令在编译时从包目录或子目录中读取的文件内容初始化字符串、[]byte、或FS类型的变量。
例如,这里有三种方法可以嵌入名为 hello.txt 的文件,然后在运行时打印其内容。
将一个文件嵌入到一个字符串中:
import _ "embed"
//go:embed hello.txt
var s string
print(s)
将一个文件嵌入到一个字节切片中:
import _ "embed"
//go:embed hello.txt
var b []byte
print(string(b))
将一个或多个文件嵌入到文件系统中:
import "embed"
//go:embed hello.txt
var f embed.FS
data, _ := f.ReadFile("hello.txt")
print(string(data))
指令
变量声明上方的//go:embed指令使用一个或多个path.Math模式指定要嵌入的文件。
该指令必须紧跟在包含单个变量声明的行之前。 指令和声明之间只允许空行和“//”行注释。
变量的类型必须是字符串类型,或字节类型的切片,或 FS(或 FS 的别名)。
例如:
package server
import "embed"
// content holds our static web server content.
//go:embed image/* template/*
//go:embed html/index.html
var content embed.FS
Go build系统将识别指令并安排声明的变量(上面示例中的content)填充文件系统中的匹配文件。
//go:embed 指令为简洁起见接受多个空格分隔的模式,但它也可以重复,以避免在有很多模式时出现很长的行。这些模式是相对于包含源文件的包目录进行解释的。 路径分隔符是一个正斜杠,即使在 Windows 系统上也是如此。 模式不得包含“.”或“..”或空路径元素,也不得以斜杠开头或结尾。 要匹配当前目录中的所有内容,请使用“*”而不是“.”。 为了允许在名称中使用空格命名文件,可以将模式编写为 Go 双引号或反引号字符串文字。
如果模式命名目录,则以该目录为根的子树中的所有文件都被嵌入(递归),但名称以“.”或“_”开头的文件除外。 所以上面例子中的变量几乎等同于:
// content is our static web server content.
//go:embed image template html/index.html
var content embed.FS
不同之处在于“image/*”可以嵌入“image/.tempfile”,而“image”则不可以。
//go:embed 指令可用于导出和未导出的变量,具体取决于包是否希望将数据提供给其他包。 它只能与包范围内的全局变量一起使用,不能与局部变量一起使用。
模式不能匹配包模块之外的文件,例如“.git/*”或符号链接。 空目录的匹配被忽略。 之后,//go:embed 行中的每个模式必须至少匹配一个文件或非空目录。
如果任何模式无效或有无效匹配,构建将失败。
字符串和字节
字符串或 []byte 类型变量的 //go:embed 行只能有一个模式,并且该模式只能匹配一个文件。 字符串或 []byte 使用该文件的内容进行初始化。
//go:embed 指令需要导入“embed”,即使在使用字符串或 []byte 时也是如此。 在不引用 embed.FS 的源文件中,使用空白导入(import _ "embed")。
文件系统
对于嵌入单个文件,字符串或 []byte 类型的变量通常是最好的。 FS 类型允许嵌入文件树,例如静态 Web 服务器内容的目录,如上例所示。
FS 实现了 io/fs 包的 FS 接口,因此它可以与任何理解文件系统的包一起使用,包括 net/http、text/template 和 html/template。
例如,给定上面例子中的内容变量,我们可以这样写:
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(content))))
template.ParseFS(content, "*.tmpl")
工具
为了支持分析 Go 包的工具,在 //go:embed 行中找到的模式在“go list”输出中可用。 请参阅“go help list”输出中的 EmbedPatterns、TestEmbedPatterns 和 XTestEmbedPatterns 字段。
索引
type FS
func (f FS) Open(name string) (fs.File, error)
func (f FS) ReadDir(name string) ([]fs.DirEntry, error)
func (f FS) ReadFile(name string) ([]byte, error)
包文件
FS类型
FS 是文件的只读集合,通常使用 //go:embed 指令初始化。 在没有 //go:embed 指令的情况下声明时,FS 是一个空文件系统。
FS 是只读值,因此可以安全地同时从多个 goroutine 中使用,并且可以安全地将 FS 类型的值相互分配。
FS 实现了 fs.FS,因此它可以与任何理解文件系统接口的包一起使用,包括 net/http、text/template 和 html/template。
有关初始化 FS 的更多详细信息,请参阅包文档。
type FS struct {
// contains filtered or unexported fields
}
func (FS) Open
func (f FS) Open(name string) (fs.File, error)
Open 打开指定的文件进行读取并将其作为 fs.File 返回。
func (FS) ReadDir
func (f FS) ReadDir(name string) ([]fs.DirEntry, error)
ReadDir 读取并返回整个命名目录。
func (FS) ReadFile
func (f FS) ReadFile(name string) ([]byte, error)
ReadFile 读取并返回指定文件的内容。
原文链接
https://golang.google.cn/pkg/embed/