go1.16 embed 能够将文件嵌入到编译后的二进制中,当前公布一个 web 程序能够只提供一个二进制程序,不须要其余文件,同时防止反复文件 io 读取。
然而在开发时,应用 embed 后如果批改前端文件那么须要重启 GO 程序,从新生成 embed 数据,导致开发过程不不便。
提供一个 embed 反对动静文件的小技巧,应用 http.Dir 和 embed.FS 混合组合一个新的 http.FileSystem, 如果当前目录存在动态文件,那么应用 http.Dir 返回动态文件内容,否则应用 embed.FS 编译的内容,这样既能够应用 http.Dir 拜访时时的动态文件,能够使公布的二进制程序应用 embed.FS 编译内置的动态文件数据。
package main
import (
"embed"
"net/http"
)
//go:embed static
var f embed.FS
func main() {
http.ListenAndServe(":8088", http.FileServer(FileSystems{http.Dir("."),
http.FS(f),
}))
}
// 组合多个 http.FileSystem
type FileSystems []http.FileSystem
func (fs FileSystems) Open(name string) (file http.File, err error) {
for _, i := range fs {
// 顺次关上多个 http.FileSystem 返回一个胜利关上的数据。file, err = i.Open(name)
if err == nil {return}
}
return
}
在代码目录创立一个 static 目录,而后外面创立一个 index.html auth.html,启动程序后就能够应用 http://localhost:8088/static/index.html 拜访到动态文件,在批改文件后不重启也会显示最新的文件内容。