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