go1.16新特性-embed包|Go主题月

236 阅读2分钟

embed包简介

embedgo 1.16新引入的包,能够把静态文件和go文件一起编译成二进制文件。使我们能够更好的进行web的开发。没有这个包之前我们一般用go-bindatago-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)
  • 参数nameFS文件系统里的路径

这个方法根据提供的FS文件系统里的路径,然后返回File类型,接下来可以使用File提供的一些方法来访问文件

ReadDir

func (f FS) ReadDir(name string) ([]fs.DirEntry, error)
  • 参数nameFS文件系统里的路径 这个方法是读取一个文件夹,然后返回这个文件夹下所有的文件。

ReadFile

func (f FS) ReadFile(name string) ([]byte, error)
  • 参数nameFS文件系统里的路径 这个方法是根据提供的文件路径,直接读取文件里的内容,然后返回[]byte