Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go:在二进制文件中嵌入静态文件_Go - Fatal编程技术网

Go:在二进制文件中嵌入静态文件

Go:在二进制文件中嵌入静态文件,go,Go,这可能是一个非常业余的问题。我正在尝试将静态文件嵌入到二进制文件中,即html。我该怎么做呢 所以我可以用这个来访问一个资产,但是如何处理“数据”,如何解析文件,执行模板,并在目录中为它们提供服务呢 我在网上找不到任何例子,非常感谢您的帮助 给定如下目录结构: example/ main.go data/hi.html 示例/main.go package main import ( "html/template" "log" "net/http"

这可能是一个非常业余的问题。我正在尝试将静态文件嵌入到二进制文件中,即html。我该怎么做呢

所以我可以用这个来访问一个资产,但是如何处理“数据”,如何解析文件,执行模板,并在目录中为它们提供服务呢


我在网上找不到任何例子,非常感谢您的帮助

给定如下目录结构:

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))
}
示例/data/hi.html

<h1>Hi, {{.Name}}</h1>
控制台输出:

<h1>Hi, James</h1>
嗨,詹姆斯 HTTP输出:


您好,James5/6年后,使用Go 1.16(2021年第1季度)应该会更容易,它增加了对嵌入式文件的支持()

允许使用
//go:embed
命名单个文件来初始化普通
字符串
[]字节
变量:

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

这引发了一场关于如何避免在使用
//go:embed

这是在和中解决的

在嵌入整个目录树时,决定从嵌入的目录结果中排除与
*
*
匹配的文件

//go:embed testdata/k*.txt
var local embed.FS
testFiles(t,local,“testdata/ken.txt”,“如果程序太慢,它必须有一个循环。\n”)
//go:Embedded testdata/k*.txt
var s字符串
testString(t,s,“局部变量s”,“如果程序太慢,它必须有一个循环。\n”)
//go:Embedded testdata/h*.txt
变量b[]字节
testString(t,string(b),“局部变量b”,“你好,world\n”)
注意:如果支持,
cmd/go
embedcfg
传递到
gccgo



另请参见(2021年1月)“选择加入
//go:embed
以不忽略文件和空目录”。

如中所示?谢谢!提供JS文件有什么好处?我试图以结构形式将它们传递到tmpl.Execute中的html模板中。我得到的JS错误是这个GET*!%20jQuery%20v2.1.3%20%7c%20%28c%29%202005%202014%2…%7c[%5c%5cw-]%7c[%5e%5c%5cx00-%5c%5cxa0]%29+%22,N=M。替换%28%22w%22,%22w@user3918985看起来你的JS文件被html模板转义了。如果您只想从二进制文件中提供文件内容,则无需使用
html/template
,只需提供从
Asset
函数获得的内容即可。在
HandleFunc
中,您可以使用
whttp.ResponseWriter
写出资产数据,如
w.write(data)
wow。。但是我必须分别写每个数据吗?或者我可以把它们放在一个目录中?我现在正在尝试。嗯,我把整个文件内容都打印在页面上。。我正在尝试编写css文件我在这里发布了另一个问题:
<h1>Hi, James</h1>
//go:embed gopher.png
var gopherPNG []byte