golang嵌入文件供以后解析执行使用

前端之家收集整理的这篇文章主要介绍了golang嵌入文件供以后解析执行使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我基本上试图通过html文件文件夹。我想将它们嵌入到二进制文件,并能够根据请求解析模板执行的目的。 (请原谅我,如果这不正确的措辞)。

任何想法,提示,技巧或更好的方式来完成这是非常赞赏。

// Template Files
type TempFiles struct {
    Files map[string]string
}

// Loop through view files and load them
func LoadTempFiles() {
    t := new(TempFiles)

    // Load template files
    filepath.Walk("application/views",func(path string,info os.FileInfo,err error) error {
    if !info.IsDir() {
        content,_ := IoUtil.ReadFile(path)
        t.Files[path] = string(content)
    }
    return nil
    })
}

func ViewTemp(w http.ResponseWriter,path string) {
    t := new(TempFiles)

    temp,err := template.New().Parse(t.Files[path])
    if err != nil {
        http.Error(w,err.Error(),http.StatusInternalServerError)
    } else {
        temp.Execute(w,nil)
    }
}
我这样做大多数Go的网络应用程序。我使用 go-bindata自动生成Go源代码从所有的文件,我想嵌入,然后将它们编译成二进制。
所有这些都是在构建过程中自动完成的。

一个缺点是,目前的go build工具不提供一个方法来钩入构建过程,所以我使用一个Makefile为此目的。当调用makefile时,它运行go-bindata来生成所有必需文件的源,然后通常执行一些额外的代码生成位和bobs(值得注意的是,创建一个Go源文件,其中列出了映射中的所有嵌入文件。目录如果你愿意)。然后它继续编译实际的程序。

这可能变得有点凌乱,但你只需要设置一次。
另一个缺点是,使用Makefile意味着软件与go get命令不兼容。但是由于我的大多数网络应用程序并不意味着被共享,这到目前为止还不是一个问题。

当涉及到调试/开发这样的应用程序时,还有另一个问题,从嵌入静态Web内容:我不能只是编辑一个HTML或CSS文件,刷新浏览器看到它的效果。我必须停止服务器,重建它,并重新启动它与每次编辑。这显然不是理想的,所以我把Makefile分成调试和释放模式。释放模式执行我上面描述的。然而,调试模式实际上不会嵌入静态文件。它会为每个文件系统生成文件,但是它不包含实际的文件数据,而是包含一个只从文件系统加载数据的存根。

就服务器代码而言,生成代码没有区别。它所做的就是调用一个函数获取给定静态文件内容。它不关心内容是实际嵌入二进制,或者如果从外部源加载。因此,这两种构建模式是可以自由互换的。

例如,在发布和调试模式下获取静态文件内容的相同生成函数将如下所示:

发布模式:

func index_html() []byte {
    return []byte {
        ....
    }
}

调试模式:

func index_html() []byte {
   data,err := IoUtil.ReadFile("index.html")
   ...
   return data
}

两种情况下的接口是相同的。这允许轻松和无忧的开发和调试。

原文链接:https://www.f2er.com/go/187866.html

猜你在找的Go相关文章