Go官方在1.16版本发布了官方内嵌资源到二进制的功能,使得部署更加简单
在开发web的时候往往会有一些web文件,而部署的时候需要部署一个二进制还要部署web文件比较繁琐,在go1.16之前也有很多包实现了内嵌资源文件到二进制中如https://github.com/gobuffalo/packr,而如今go官方实现了这个特性
基本用法
1 2 3 4 5 6 7 8 9 10 11 12 13
| package main
import ( _ "embed" "fmt" )
var f string
func main() { fmt.Println(f) }
|
上面的例子就是将当前目录的dockerfile内容内嵌到变量f中,编译之后即使这个文件不存在也能打印出内容
嵌入文件夹
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package main
import ( "embed" "fmt" "path/filepath" )
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这个变量中,然后打印出这个文件夹里文字的名字和内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| $ 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
参考资料
https://www.cnblogs.com/apocelipes/p/13907858.html