go1.16 embed能够将文件嵌入到编译后的二进制中,之后发布一个web程序能够只提供一个二进制程序,不须要其余文件,同时避免重复文件io读取。html
可是在开发时,使用embed后若是修改前端文件那么须要重启GO程序,从新生成embed数据,致使开发过程不方便。前端
提供一个embed支持动态文件的小技巧,使用http.Dir和embed.FS混合组合一个新的http.FileSystem,若是当前目录存在静态文件,那么使用http.Dir返回静态文件内容,不然使用embed.FS编译的内容,这样既能够使用http.Dir访问时时的静态文件,能够使发布的二进制程序使用embed.FS编译内置的静态文件数据。web
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访问到静态文件,在修改文件后不重启也会显示最新的文件内容。code