ZetCode

Go embed

最后修改时间 2024 年 4 月 11 日

在本文中,我们展示了如何在运行中的 Go 程序中访问嵌入的文件。

embed 包允许在运行中的 Go 二进制文件中访问静态文件,例如图片和 HTML 文件。它是在 Go 1.16 中引入的。

Go 嵌入文本文件

在第一个示例中,我们将一个文本文件嵌入到一个字节切片中。

data/words.txt
sky
blue
rock
water
array
karma
falcon

我们在文本文件中有一些单词。

main.go
package main

import (
    "bytes"
    _ "embed"
    "fmt"
)

var (
    //go:embed data/words.txt
    data []byte
)

func main() {

    fmt.Println(string(data))

    fmt.Println("----------------------")

    words := bytes.Split(data, []byte{'\n'})

    for _, w := range words {

        fmt.Println(string(w))
    }
}

我们将一个文本文件嵌入程序中并打印数据。

var (
    //go:embed data/words.txt
    data []byte
)

嵌入是通过在变量声明上方使用 //go:embed 指令来完成的。

$ go build
$ ./txtfile.exe
sky
blue
rock
water
array
karma
falcon
----------------------
sky
blue
rock
water
array
karma
falcon

Go 嵌入多个文件

在下面的示例中,我们嵌入了两个文本文件。

data/langs.txt
Perl
Raku
F#
Clojure
Go
C#

这是 langs.txt 文件。

data/words.txt
sky
blue
rock
falcon
war
tree
storm
cup

这是 words.txt 文件。

main.go
package main

import (
    "embed"
    "fmt"
)

//go:embed data/*
var f embed.FS

func main() {

    langs, _ := f.ReadFile("data/langs.txt")
    fmt.Println(string(langs))

    words, _ := f.ReadFile("data/words.txt")
    fmt.Println(string(words))
}

我们嵌入了两个文本文件并打印了它们的内容。

//go:embed data/*
var f embed.FS

使用 * 通配符,我们可以嵌入 data 目录中的所有文件。

$ go build
$ ./files.exe
Perl
Raku
F#
Clojure
Go
C#

sky
blue
rock
falcon
war
tree
storm
cup

Go 嵌入静态文件

在下面的示例中,我们将静态文件嵌入到 Web 应用程序的二进制文件中。

public/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Home</title>
</head>
<body>
    <p>
        Home page
    </p>
</body>
</html>

这是 index.html 文件。

public/about.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>About</title>
</head>
<body>
    <p>
        About page
    </p>
</body>
</html>

这是 about.html 文件。

main.go
package main

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

//go:embed public
var content embed.FS

func handler() http.Handler {

    fsys := fs.FS(content)
    html, _ := fs.Sub(fsys, "public")

    return http.FileServer(http.FS(html))
}

func main() {

    mux := http.NewServeMux()
    mux.Handle("/", handler())

    http.ListenAndServe(":8080", mux)
}

该代码示例运行一个服务器,该服务器提供两个静态文件。我们嵌入了一个整个目录。

//go:embed public
var content embed.FS

embed.FS 允许嵌入一个文件树。

func handler() http.Handler {

    fsys := fs.FS(content)
    html, _ := fs.Sub(fsys, "public")

    return http.FileServer(http.FS(html))
}

该处理程序从 public 目录提供静态文件。在 Go 中,http.FileServer 用于提供静态内容。

来源

Go embed 包 - 参考

在本文中,我们展示了如何使用 embed 包在运行中的 Go 程序中访问静态文件。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出所有 Go 教程