这可能是一个非常业余的问题。我正在尝试将静态文件嵌入到二进制文件中,即。 HTML。如何使用https://github.com/jteeuwen/go-bindata完成此操作?
所以我可以使用https://github.com/jteeuwen/go-bindata#accessing-an-asset访问资产,但是如何处理“数据”,以及如何解析文件,执行模板并在目录中提供它们?
我在网上找不到任何示例,并会感谢一些帮助!
答案 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 275092和commit 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")