Golang中如何解决模板解析错误:unexpected “.mytmpl” in template clause

Golang中如何解决模板解析错误:unexpected “.mytmpl” in template clause 当我定义模板如 {{define “home”}}{{end}} 并在 HTML 文件中使用 {{template “home”}} 时,一切正常。但当我尝试使用变量作为模板时,却出现了 panic。例如,在 Go 代码中我传递了一个变量 “mytmpl”: “home”,并在模板中使用 {{template .mytmpl}},同时 “home” 模板也已定义。但仍然出现了 panic。

// go code
gin.H{
    "title":    "Home",
    "username": name,
    "mytmpl":  "home",
},
<!-- html template -->
<body>
<div>
{{template .mytmpl}} // 这里出现了 panic
</div>
</body>

更多关于Golang中如何解决模板解析错误:unexpected “.mytmpl” in template clause的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

因为它需要在编译时(模板的编译时)是一个静态已知的字面字符串。至少这是我对文档的理解,因为每个示例都使用字面字符串。

// 代码部分保持原样

更多关于Golang中如何解决模板解析错误:unexpected “.mytmpl” in template clause的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


能否提供完整的错误重现代码,并详细描述您具体想要实现什么功能?

这里有一些关于 Go 模板的优秀文章,或许您能找到有用的信息:
Go 模板入门指南 - 上下文编码

在 Go 模板中,当使用变量作为模板名称时,需要确保变量值是一个已定义的模板名称。从你的代码来看,问题可能出现在模板解析或执行阶段。以下是解决方案和示例代码:

首先,确保所有模板都正确解析。在 Gin 框架中,需要使用 LoadHTMLGlobLoadHTMLFiles 加载模板文件。以下是完整的示例:

Go 代码:

package main

import (
    "net/http"
    
    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()
    
    // 加载模板文件
    router.LoadHTMLGlob("templates/*")
    
    router.GET("/", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.html", gin.H{
            "title":    "Home",
            "username": "John",
            "mytmpl":   "home", // 确保与定义的模板名称匹配
        })
    })
    
    router.Run(":8080")
}

模板文件结构:

templates/
    index.html
    home.html

index.html:

<!DOCTYPE html>
<html>
<head>
    <title>{{.title}}</title>
</head>
<body>
    <div>
        <h1>Welcome {{.username}}</h1>
        {{template .mytmpl}} <!-- 使用变量调用模板 -->
    </div>
</body>
</html>

home.html:

{{define "home"}}
<div>
    <p>This is the home template content.</p>
</div>
{{end}}

关键点:

  1. 确保 home 模板在某个加载的模板文件中正确定义(使用 {{define "home"}}...{{end}}
  2. 传递给模板的 mytmpl 变量值必须与定义的模板名称完全匹配
  3. 所有模板文件都位于 LoadHTMLGlob 指定的路径中

如果仍然出现错误,检查:

  • 模板文件扩展名和路径是否正确
  • 模板名称大小写是否一致
  • 是否在所有需要的文件中都正确加载了模板

运行此代码后,访问 http://localhost:8080 应该能正常显示包含 home 模板内容的页面。

回到顶部