zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    css 背景透明 适合所有浏览器
    Razor中Html.DropDownListFor用法
    outlook2010如何初始化设置
    移除文件关联
    MVC中的Html.ActionLink的介绍(转)
    DES可逆加解密
    Razor视图下服务器代码给Javascript变量赋值
    js获取url参数值
    python 3 简单线程、数据库操、Mssql访问示例
    ps快捷键
  • 原文地址:https://www.cnblogs.com/fenggedainifei/p/15256771.html
Copyright © 2011-2022 走看看