go资源内嵌embed
Go官方在1.16版本发布了官方内嵌资源到二进制的功能,使得部署更加简单
在开发web的时候往往会有一些web文件,而部署的时候需要部署一个二进制还要部署web文件比较繁琐,在go1.16之前也有很多包实现了内嵌资源文件到二进制中如https://github.com/gobuffalo/packr,而如今go官方实现了这个特性
基本用法
package main
import (
_ "embed"
"fmt"
)
//go:embed Dockerfile
var f string
func main() {
fmt.Println(f)
}
上面的例子就是将当前目录的dockerfile内容内嵌到变量f中,编译之后即使这个文件不存在也能打印出内容
嵌入文件夹
package main
import (
"embed"
"fmt"
"path/filepath"
)
//go:embed foo
var fs embed.FS
func main() {
files, err := fs.ReadDir("foo")
if err != nil {
fmt.Println(err)
}
for _, file := range files {
d, _ := fs.ReadFile(filepath.Join("foo", file.Name()))
if err != nil {
fmt.Println(err)
}
fmt.Println("文件名:", file.Name(), "内容:", string(d))
}
}
上面的代码将目录下的foo目录内嵌到fs这个变量中,然后打印出这个文件夹里文字的名字和内容
$ tree foo
foo
├── test
└── test2
0 directories, 2 files
# 编译
$ go build -o test .
# 执行
$ ./test
文件名: test 内容: hahah
文件名: test2 内容: testest
注意
- 路径默认是从mod的目录为根目录
- 会忽略”.“开头和”_“开头的文件
- 不管是win还是linux都使用”/“
- 支持匹配如,
//go:embed foo/*.yaml
- 可以同时导入多个目录 如
//go:embed foo test