如果我在模板文件中指定了一个不存在的模板,则ParseFiles()不会检测到错误,而是ExecuteTemplate()会检测到错误.人们希望解析能够检测到任何缺失的模板.在解析过程中检测到这样的错误也可以提高性能.

{{define "test"}}
<html>
    <head>
        <title> test </title>
    </head>
    <body>
        <h1> Hello, world!</h1>
        {{template "doesnotexist"}}
    </body>
</html>
{{end}}

main.go

package main

import (
    "html/template"
    "os"
    "fmt"
)

func main() {
    t, err := template.ParseFiles("test.html")
    if err != nil {
        fmt.Printf("ParseFiles: %s\n", err)
        return
    }

    err = t.ExecuteTemplate(os.Stdout, "test", nil)
    if err != nil {
        fmt.Printf("ExecuteTemplate: %s\n", err)
    }
}

10:46:30 $ go run main.go 
ExecuteTemplate: html/template:test.html:8:19: no such template "doesnotexist"
10:46:31 $ 

推荐答案

template.ParseFiles()不会报告缺少的模板,因为通常不是所有模板都在一个步骤中解析,而报告缺少的模板(template.ParseFiles())不允许这样做.

可以使用来自多个来源的多个调用来解析模板.

例如,如果调用Template.Parse()方法或模板,可以向其中添加更多模板:

_, err = t.Parse(`{{define "doesnotexist"}}the missing piece{{end}}`)
if err != nil {
    fmt.Printf("Parse failed: %v", err)
    return
}

上面的代码将添加缺少的部分,您的模板执行将成功并生成输出(在Go Playground上try ):

<html>
    <head>
        <title> test </title>
    </head>
    <body>
        <h1> Hello, world!</h1>
        the missing piece
    </body>
</html>

更进一步说,不需要解析和"呈现"所有模板就可以实现优化.有可能存在"普通"用户从未使用过的管理员页面,并且只有管理员用户启动或使用您的应用程序时才需要这些页面.在这种情况下,你可以通过不解析管理员页面(仅当管理员用户使用你的应用时)来加速启动和相同的内存.

见相关:Go template name

Go相关问答推荐

如何创建两个连接的io.ReadWriteClosers以用于测试目的

有没有办法通过Go cmdline或IDE(IntelliJ)找出我的 struct 实现了什么接口?

带有条件的for循环中缺少RETURN语句

你能把用户界面文件中的GTK4应用程序窗口添加到GTK4应用程序中吗?

Websocket服务器实现与x/net库trowing 403

理解Golang中的IOTA和常量

包裹网.Conn导致挂起读取

Golang在不写入磁盘的情况下为jpeg图像生成一致的哈希

运行 Docker 容器 - X11 无法打开显示:0

死锁 - 所有 goroutine 都处于睡眠状态(即使使用等待组)

Golang Docker Selenium Chrome

使用GOTK3和librsvg在Go中如何加载内联SVG?

当我的 go build 成功时,如何修复我的 docker build 失败? Dockerfile 包括 go mod 下载

错误!在为 age-viewer-go 运行 wails dev 或 wails build 命令时

如何使用 go-git 将特定分支推送到远程

使用 unsafe.Pointer 将 struct point直接转换为另一个 struct 是否安全?

为什么不同的 Wireguard 私钥会产生相同的公钥?

Go泛型:无效的复合文字

在 Go 中发送 ack 和 term 后消息仍在 nats 限制队列中

函数的递归调用以 goroutine 和惯用方式开始,以在所有工作 goroutine 完成时继续调用者