Golang - embed的使用
简介
在Go语言应用程序中包含任何文件、目录的内容,都打包到生成的Go语言应用程序中,部署时直接执行一个二进制文件就可以,不用再包含一些静态文件,因为它们已经被打包到生成的应用程序。
基本用法
通过//go:embed
指令即可
package main
import (
"embed"
"fmt"
)
//go:embed fire
var s string
//go:embed fire
var b []byte
//go:embed templates
var fs embed.FS
func main() {
fmt.Println(s)
fmt.Println(string(b))
data, err := fs.ReadFile("templates/index.tmpl")
fmt.Println(err,string(data))
}
以上代码中,主要是通过//go:embed
指令达到读取文件内容的目的。//go:embed
指令后可以是一个文件,也可以是多个文件(空格隔开即可),也可以是一个目录。 其中string
和[]byte
类型都只能匹配一个文件,如果要匹配多个文件或者一个目录,就要使用embed.FS
类型。
特别注意:embed这个包一定要导入,如果导入不使用的话,使用 _ 导入即可。
用处
- 能够在命令行工具里嵌入WEB
- go install 快速安装,启动web
- 该web可以提供生成代码的平台
- 该web可以提供例如json to struct等数据结构转换
- 可大大提高Go的工具链能力
- 能够将前端资源打包到一个二进制包里,方便部署和安装
- 静态资源访问没有io操作,速度非常快
总结
1、go embed 只能读取到它所在.go文件所属的目录及其子目录的内容,无法读取上级目录
2、go embed 所生成的文件系统会连着原文件的目录结构一起存入,若需要将指定文件夹作为根目录使用,则可以使用Sub函数来生成一个子文件系统