为了账号安全,请及时绑定邮箱和手机立即绑定

如何在子文件夹/包中使用 Go 1.16 嵌入功能?

如何在子文件夹/包中使用 Go 1.16 嵌入功能?

Go
开满天机 2022-08-09 20:29:06
Go 1.16已经出来了,我想使用新的嵌入功能。如果所有内容都在主包中,我可以让它工作。但目前尚不清楚如何处理从子文件夹/包访问资源。尝试使用嵌入来执行此操作。金融服务支持。例如,我在处理程序包/文件夹中有一个main.go和一个HTTP处理程序如果我将处理程序放在主要位置,它就可以工作了。如果我把它放在处理程序包中,它找不到模板。我得到:handlers/indexHandler.go:11:12: pattern templates: no matching files found exit status 1同样,如果我从 / 提供静态文件夹中的图像,我可以让它从静态文件夹中提供图像。但是我不能同时提供来自 / 的处理程序和来自 / 的静态/图像。如果我将图像放在/static/上,它找不到图像。我认为这与相对路径有关。但是我无法通过反复试验找到正确的组合...依赖这些功能是否为时过早?以前我使用的是go-rice,我没有这些问题。但我想尽可能多地使用std库。main.go:package mainimport (...)//go:embed staticvar static embed.FSfunc main() {    fsRoot, _ := fs.Sub(static, "static")    fsStatic := http.FileServer(http.FS(fsRoot))    http.Handle("/", fsStatic)    http.HandleFunc("/index", Index)    http.ListenAndServe(":8080", nil)}handlers/indexHandler.go:package handlersimport (...)//go:embed templatesvar templates embed.FS// Index handlerfunc Index(w http.ResponseWriter, r *http.Request) {    tmpl := template.New("")    var err error    if tmpl, err = tmpl.ParseFS(templates, "simple.gohtml"); err != nil {        fmt.Println(err)    }    if err = tmpl.ExecuteTemplate(w, "simple", nil); err != nil {        log.Print(err)    }    }结构如下....├── go.mod├── go.sum├── handlers│   └── indexHandler.go├── main.go├── static│   ├── css│   │   └── layout.css│   └── images│       └── logo.png└── templates    └── simple.gohtml
查看完整描述

2 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

我终于想通了...


您可以将模板文件夹保留在主文件夹中,然后从那里嵌入它们。然后,您需要将 FS 变量注入到另一个处理程序包中。在你弄清楚之后,它总是很容易的。


例如:


package main


//go:embed templates/*

var templateFs embed.FS


func main() {

    handlers.TemplateFs = templateFs

...

package handlers


var TemplateFs embed.FS


func handlerIndex() {

    ...

    tmpl, err = tmpl.ParseFS(TemplateFs, "templates/layout.gohtml",...

...


查看完整回答
反对 回复 2022-08-09
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

目前在Go 1.17中,嵌入不支持子文件夹/包,请参阅 https://github.com/golang/go/issues/41191#issuecomment-686616556


查看完整回答
反对 回复 2022-08-09
  • 2 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信