Golang模板无法访问embedFS中的文件。

huangapple go评论75阅读模式
英文:

Golang template can't access file in embedFS

问题

我的golang代码结构如下:

├── embeded.go
├── go.mod
├── json
│     └── file
└── main.go

这是我的embeded.go代码:

package main

import "embed"

//go:embed json/*
var templatesFS embed.FS

func TemplatesFS() embed.FS {
	return templatesFS
}

现在在我的main.go中,我无法访问json目录中的文件:

package main

import (
	"fmt"
	"log"
	"os"
	"text/template"
)

func main() {
	tmpl := template.Must(
		template.New("json/file").
			ParseFS(TemplatesFS(), "json/file"))
	if err := tmpl.Execute(os.Stdout, "config"); err != nil {
		log.Fatal(err)
	}
}

当我运行上述代码时,我得到错误信息template: json/file: "json/file" is an incomplete or empty template

但是我可以像这样访问file

file, err := TemplatesFS().ReadFile("json/file")

那么为什么我无法在template.Execute中访问它呢?

我该如何解决这个问题?

英文:

my golang code arch is as bellow:

├── embeded.go
├── go.mod
├── json
│   └── file
└── main.go

and this is my embede.go code:

package main

import "embed"

//go:embed json/*
var templatesFS embed.FS

func TemplatesFS() embed.FS {
	return templatesFS
}

now in my main.go I can't access file in json directory:

package main

import (
	"fmt"
	"log"
	"os"
	"text/template"
)

func main() {
	tmpl := template.Must(
		template.New("json/file").
			ParseFS(TemplatesFS(), "json/file"))
	if err := tmpl.Execute(os.Stdout, "config"); err != nil {
		log.Fatal(err)
	}
}

when I run above code I got error template: json/file: "json/file" is an incomplete or empty template

but I can access the file like this:

file, err := TemplatesFS().ReadFile("json/file")

so why I can't access it in templte.execute ?

How Can I Solve It ?

答案1

得分: 2

模板解析器成功从嵌入的文件系统中读取了一个模板。

Execute方法报告模板tmpl不完整。变量tmpl被设置为通过调用New创建的模板。模板不完整是因为应用程序没有解析带有模板名称json/file的模板。

ParseFS使用文件的基本名称来命名模板。修复方法是在调用New时使用文件的基本名称。

tmpl := template.Must(
    template.New("file").ParseFS(TemplatesFS(), "json/file"))
英文:

The template parser successfully read a template from the embedded file system.

The Execute method reports that the template tmpl is incomplete. The variable tmpl is set to the template created by the call to New. The template is incomplete because the application did not parse a template with the template's name, json/file.

ParseFS names templates using the file's base name. Fix by using using the file's base name in the call to New.

tmpl := template.Must(
    template.New("file").ParseFS(TemplatesFS(), "json/file"))     

huangapple
  • 本文由 发表于 2022年9月15日 14:07:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/73726319.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定