☀️ 前言
我自己在写Go的时候不想将网站的静态资源拷贝给客户,我希望用户只有一个文件运行就好了。好在Go1.16开始支持 go:embed 特性。
embed.FS
实现了io/fs.FS
接口,它可以打开一个文件,返回fs.File
- 可以嵌入文件和文件夹
- 嵌入的文件夹内容不会包含
.
和_
开头的文件和文件夹(例如:.git、_text.txt、.env)
☃️ 声明
//go:embed images
var imgs embed.FS
//go:embed a.txt
var txt []byte
//go:embed b.txt
var txt2 string
//go:embed
//之后不能有空格
📖 目录
//go:embed
不支持./
和../
路径,只能获取当前目录下的目录或文件
🔨 使用
关键代码
//go:embed static
标识出static这个文件夹嵌入进来
下面一行的var f embed.FS
表示将static文件夹嵌入的内容放到变量f
里面
//go:embed static
格式一定不能错
//go:embed static
格式一定不能错
//go:embed static
格式一定不能错嵌入的文件夹内容不会包含
.
和_
开头的文件和文件夹(例如:.git、_text.txt、.env)
📂 嵌入文件夹
import (
"embed"
"fmt"
"html/template"
"net/http"
"github.com/gin-gonic/gin"
)
//go:embed static
var f embed.FS
func main(){
router := gin.Default()
// example: /static/js/1.js
router.StaticFS("/static", http.FS(f))
router.Run(":8888")
}
📃嵌入文件
import (
"embed"
"fmt"
"html/template"
"net/http"
"github.com/gin-gonic/gin"
)
//go:embed static/hello.txt
var f embed.FS
func main(){
data, _ := f.ReadFile("static/hello.txt")
fmt.Println(string(data))
}