embed包简介
embed是go 1.16新引入的包,能够把静态文件和go文件一起编译成二进制文件。使我们能够更好的进行web的开发。没有这个包之前我们一般用go-bindata或go-bindata-assetfs先把静态文件编译成go文件,然后再用go命令编译成二进制文件,过程比较繁琐。现在官方提供了embed这个包后,可以直接通过一行命令(//go:embed)来导入静态文件,然后go命令编译时会把导入的静态文件也一起编译成二进制文件。
导入静态文件方式
embed提供了3种导入静态文件的方式,分别可以导入为string字符串,或[]byte字节数组,或embed.FS文件系统。
- 导入为
string字符串
//go:embed text.txt
var content string
- 导入为
[]byte字节数组
//go:embed text.txt
var content []byte
- 导入为
embed.FS文件系统
//go:embed static
var static embed.FS
embed.FS文件系统
当导入静态文件为embed.FS文件系统时,go内部就会构建一个类似unix的层级文件系统,FS里的文件都是只读权限,所以可以安全的在多线程中访问它。FS也提供了三个方法供我们使用
- Open(name)
- ReadDir(name)
- ReadFile(name)
Open
func (f FS) Open(name string) (fs.File, error)
- 参数
name是FS文件系统里的路径
这个方法根据提供的FS文件系统里的路径,然后返回File类型,接下来可以使用File提供的一些方法来访问文件
ReadDir
func (f FS) ReadDir(name string) ([]fs.DirEntry, error)
- 参数
name是FS文件系统里的路径 这个方法是读取一个文件夹,然后返回这个文件夹下所有的文件。
ReadFile
func (f FS) ReadFile(name string) ([]byte, error)
- 参数
name是FS文件系统里的路径 这个方法是根据提供的文件路径,直接读取文件里的内容,然后返回[]byte