golang embed包翻译

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)

包文件

embed.go

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/

github个人博客

https://wangyufenggogogo.github.io

posted @ 2021-09-11 21:08  wangyufeng  阅读(289)  评论(0编辑  收藏  举报