go - 为什么当我忽略template.New()时程序可以成功运行?

标签 go templates go-templates

我正在尝试使用 html/template 解析结构格式的 JSON。

func handler(w http.ResponseWriter, r *http.Request) {
    var issueList = template.Must(template.New("template01").ParseFiles("template01.tmpl"))
    result, err := SearchIssues(os.Args[1:])
    if err != nil {
        log.Fatal(err)
    }
    if err := issueList.Execute(w, result); err != nil {
        log.Fatal(err)
    }
}

函数SearchIssues用于将流转换为JSON格式,效果很好。

然后我尝试使用 html/template 解析 JSON

var issueList = template.Must(template.New("template01").ParseFiles("template01.tmpl"))

当我访问本地服务时,出现错误:XXX 是不完整或空的模板

但是当我删除New("template01").时,程序运行良好。

像这样:

func handler(w http.ResponseWriter, r *http.Request) {
    var issueList = template.Must(template.ParseFiles("template01.tmpl"))
    result, err := SearchIssues(os.Args[1:])
    if err != nil {
        log.Fatal(err)
    }
    if err := issueList.Execute(w, result); err != nil {
        log.Fatal(err)
    }
}

我不是母语人士,英语不是很好,抱歉。

最佳答案

您的第一个代码的问题在于,当您这样做时:

var issueList = template.Must(template.New("template01").
    ParseFiles("template01.tmpl"))

template.New()将创建一个名为“template01”的新模板。变量 issueList 将引用这个空模板。您将其称为Template.ParseFiles() 方法,它将解析“template01.tmpl”文件并创建一个名为“template01.tmpl”关联模板>。变量 issueList 仍将引用 template01 模板,而不是从文件中解析的模板。当您调用Template.Excute()时,它执行 issueList 指定的(默认)模板,即空的 template01。这就是您收到错误不完整或空模板的原因。

在你的第二个版本中:

var issueList = template.Must(template.ParseFiles("template01.tmpl"))

您调用template.ParseFiles() 函数,解析“template01.tmpl”文件,并返回其模板。因此 issueList 将引用文件中解析后的模板,而不是空模板。因此 Template.Execute() 将执行此模板。

注意:如果在第一种情况下您会使用 Template.ExecuteTemplate() ,您可以命名要执行的模板:

if err := issueList.Execute(w, "template01.tmpl", result); err != nil {
    log.Fatal(err)
}

这将会成功,因为您明确指示执行从文件解析的“template01.tmpl”,而不是默认的空模板。

另请注意,您不应在处理程序中解析模板,这很慢。在此之前解析一次,将结果存储在包级变量中,然后在处理程序中执行它。详情参见It takes too much time when using "template" package to generate a dynamic web page to client in Golang

有关关联模板的详细信息,请参阅 Go template name .

另外请使用encoding/json生成 JSON 输出,而不是 text/templatehtml/template。模板引擎对JSON格式和编码一无所知,很容易生成无效的JSON。

关于go - 为什么当我忽略template.New()时程序可以成功运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73959229/

相关文章:

go - 性能几乎以线性方式提高,将GOMAXPROCS从1增加到4,但此后保持平稳

c++ - 限制可变参数函数模板仅接受一个可变参数类模板的嵌套可变参数类模板的变体?

c++ - 如何写一个模板类来存放不同的模板类

templates - 有没有办法列出使用过的变量?

go - 获取等待写入 channel /从 channel 读取的 goroutines 的数量(用于分析)

sql - 使用 Postgres 时为 "Operator does not exist: integer =?"

go - 你如何决定你的函数是否应该像接收器一样使用指针?

c++ - 从成员变量访问静态 constexpr 成员,GCC 错误?

go - 迭代模板 slice 中可变数量的项目

docker-compose - docker-compose 文件中哪里允许使用 Go 模板?