embed小技巧-动态文件更新

eudore · · 160 次点击 · · 开始浏览    

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访问到静态文件,在修改文件后不重启也会显示最新的文件内容。


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:eudore

查看原文:embed小技巧-动态文件更新

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

160 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传