go: embed

go: embed

go:embed​ 是 Go 语言在其 1.16 版本中引入的一个新功能,它允许开发者在编译时将文件或文件夹嵌入到 Go 程序中。这样做可以简化资源文件的分发,因为它们会被编译到可执行文件里,避免了在运行时需要处理文件路径和分发额外文件的问题。

要使用 go:embed​,你需要做以下几步:

  1. 导入 embed​ 包。
  2. 使用 //go:embed​ 指令来标记要嵌入的文件或文件夹。
  3. 声明一个变量来接收嵌入的内容,类型可以是 string​、[]byte​ 或 embed.FS​(用于目录或多个文件)。

下面是一个使用 go:embed​ 的示例:

package main

import (
    "embed"
    "io/fs"
    "io/ioutil"
    "log"
    "net/http"
)

//go:embed version.txt
var version string

//go:embed config.json
var config []byte

//go:embed static
var staticFiles embed.FS

func main() {
    // 使用嵌入的字符串
    log.Println("Version:", version)

    // 使用嵌入的字节切片
    configContents, err := ioutil.ReadAll(fs.FS(config))
    if err != nil {
        log.Fatal(err)
    }
    log.Println("Config:", string(configContents))

    // 使用嵌入的文件系统
    http.Handle("/", http.FileServer(http.FS(staticFiles)))
    log.Fatal(http.ListenAndServe(":8080", nil))
}

在上面的代码中:

  • version.txt​ 文件的内容会被嵌入到 version​ 变量中,类型为 string​。
  • config.json​ 文件的内容会被嵌入到 config​ 变量中,类型为 []byte​。
  • static​ 目录及其内容会被嵌入到 staticFiles​ 变量中,类型为 embed.FS​。

请注意,使用 go:embed​ 的文件或目录必须在同一个包中。此外,go:embed​ 只能用于全局变量,且这些变量不能是导出的(即变量名不能以大写字母开头),除非它们是用来嵌入的类型(string​、[]byte​、embed.FS​)。

在运行 go build​ 编译程序时,Go 编译器会处理这些指令,并将指定的文件或目录内容嵌入到最终的可执行文件中。

posted @ 2024-03-27 20:09  pDJJq  阅读(34)  评论(0编辑  收藏  举报