嵌入静态文件

概述

参考:

embed 包可以让我们在编译时,将各种静态文件也编译进 Go 的二进制文件中。所以称之为 embed(嵌入)。 要使用 embed 包,除了导入以外,还需要在在声明变量时,添加注释 //go:ebed /PATH/TO/FILE 以使用 go:embed 指令,embed 包将会读取所有 .go 文件中的 go:embed 指令,并将其中的文件加载到变量中,该变量将会保存需要嵌入的静态文件。

注意,注释中 // 和后面的 go:ebed 中间不能有空格

go:ebed 指令有 3 种格式导入静态文件 一、将一个文件嵌入为字符格式

package main

import (
	_ "embed"
	"fmt"
)

//go:embed hello.txt
var s string

func main() {
	fmt.Println(s)
}

二、将一个文件嵌入为 bytes 切片

package main

import (
	_ "embed"
	"fmt"
)

//go:embed hello.txt
var b []byte

func main() {
	fmt.Println(string(b))
}

三、将一个或多个文件嵌入到文件系统中

package main

import (
	"embed"
	"fmt"
)

//go:embed hello.txt
var f embed.FS

func main() {
    data, _ := f.ReadFile("hello.txt")
    print(string(data))
}

静态文件的嵌入功能,最常用于 Web 程序,我们可以将前端的所有静态资源文件嵌入到编译好的二进制文件中,这样,不再需要 Nginx,只使用一个 Go 的二进制文件,即可随处运行~~比如:

package main

import (
	"embed"
	"net/http"
)

var (
	//go:embed hello.txt
	f embed.FS
)

func main() {
	http.Handle("/", http.FileServer(http.FS(f)))
	http.ListenAndServe(":8080", nil)
}

最后修改 October 4, 2023: 合并 commit (98ba273b)