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 访问到静态文件,在修改文件后不重启也会显示最新的文件内容。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.