Go嵌入教程展示了如何从正在运行的Go程序中访问嵌入文件。
embed
包允许从运行的Go二进制文件中访问静态文件,例如图像和HTML文件。它是在Go1.16中引入的。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
去嵌入一个文本文件
在第一个例子中,我们将一个文本文件嵌入到一片字节中。
sky blue rock water array karma falcon
我们在文本文件中有几个词。
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
去嵌入多个文件
在下面的例子中,我们嵌入了两个文本文件。
Perl Raku F# Clojure Go C#
这是langs.txt
文件。
sky blue rock falcon war tree storm cup
这是words.txt
文件。
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
使用*通配符,我们将所有文件嵌入到数据目录中。
$ go build $ ./files.exe Perl Raku F# Clojure Go C# sky blue rock falcon war tree storm cup
去嵌入静态文件
在下面的示例中,我们将静态文件嵌入到Web应用程序的二进制文件中。
<!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
文件。
<!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
文件。
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程序中访问静态文件。
列出所有Go教程。