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 用于提供静态内容。
来源
在本文中,我们展示了如何使用 embed 包在运行中的 Go 程序中访问静态文件。