Go:用二进制嵌入静态文件

时间:2015-01-11 17:11:32

标签: go

这可能是一个非常业余的问题。我正在尝试将静态文件嵌入到二进制文件中,即。 HTML。如何使用https://github.com/jteeuwen/go-bindata完成此操作?

所以我可以使用https://github.com/jteeuwen/go-bindata#accessing-an-asset访问资产,但是如何处理“数据”,以及如何解析文件,执行模板并在目录中提供它们?

我在网上找不到任何示例,并会感谢一些帮助!

2 个答案:

答案 0 :(得分:4)

给定如下目录结构:

example/
    main.go
    data/hi.html

示例/ main.go

package main

import (
    "html/template"
    "log"
    "net/http"
    "os"
)

var tmpl *template.Template

func init() {
    data, err := Asset("data/hi.html")
    if err != nil {
        log.Fatal(err)
    }
    tmpl = template.Must(template.New("tmpl").Parse(string(data)))
}

func main() {
    // print to stdout
    tmpl.Execute(os.Stdout, map[string]string{"Name": "James"})

    http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
        tmpl.Execute(w, map[string]string{"Name": "James"})
    })

    log.Fatal(http.ListenAndServe(":8000", nil))
}

示例/数据/ hi.html

<h1>Hi, {{.Name}}</h1>

像这样跑:

go-bindata data && go build && ./example

控制台输出:

<h1>Hi, James</h1>

HTTP输出:

嗨,詹姆斯

答案 1 :(得分:0)

5/6年后,Go 1.16(Q1 2021)应该更容易了,它增加了对嵌入式文件(issue/proposal 41191的支持)

允许使用//go:embed命名单个文件来初始化普通的string[]byte变量:

//go:embed gopher.png
var gopherPNG []byte

需要导入才能将文件标记为包含//go:embed行并且需要处理。
可以教Goimports(和gopls等)此规则,并根据需要自动将导入内容添加到带有//go:embed的任何文件中。

这引发了关于issue 42328的争论,讨论如何避免在使用//go:embed时意外包含“隐藏”文件

这已在CL 275092commit 37588ff中解决

决定在嵌入整个目录树时从嵌入目录中排除匹配.*_*的文件。

请参见src/embed/internal/embedtest/embed_test.go

    //go:embed testdata/k*.txt
    var local embed.FS
    testFiles(t, local, "testdata/ken.txt", "If a program is too slow, it must have a loop.\n")

    //go:embed testdata/k*.txt
    var s string
    testString(t, s, "local variable s", "If a program is too slow, it must have a loop.\n")

    //go:embed testdata/h*.txt
    var b []byte
    testString(t, string(b), "local variable b", "hello, world\n")