Go 戈朗模板赢得';t载荷

Go 戈朗模板赢得';t载荷,go,go-templates,go-gin,Go,Go Templates,Go Gin,我开始编写一个Gin应用程序,我的项目树如下 -assets --css ---{bootstrap} -templates --layouts ---footer.html ---head.html ---header.html --book.html -main.go 在main.go中,我加载模板,没有错误 router.LoadHTMLGlob("./templates/layouts/*.html") 我定义模板 {{ define "head" }} <head>

我开始编写一个Gin应用程序,我的项目树如下

-assets
--css
---{bootstrap}
-templates
--layouts
---footer.html
---head.html
---header.html
--book.html
-main.go
在main.go中,我加载模板,没有错误

router.LoadHTMLGlob("./templates/layouts/*.html")
我定义模板

{{ define "head" }}
<head>
    //Head
</head>
 {{ end }}
但当我尝试使用它们时,我得到的是空输出

 {{ template "header" . }}
 <h1>{{ .Title}}</h1>

 <h3>{{ .Author.Fullname}}</h3>

完整的代码可以在路由器上找到。LoadHTMLGlob和template是处理模板的两种不同方法。
ParseFiles
返回的模板不知道
LoadHTMLGlob
加载的模板。一旦决定使用
LoadHTMLGlob
,就应该使用来呈现模板。这个方法的
name
参数可以是
{{define“name”}
操作中指定的名称,也可以是模板文件的基本名称(包括我相信的扩展名)

因此,在您的情况下,您可能应该这样做:

c.HTML(http.StatusOK, "book.html", book)
更多示例可在此处找到:

请记住,这取决于哪些状态:

分析多个同名文件时,请使用不同的 目录,最后一个提到的将是一个结果


这意味着,如果您想通过
c.HTML
访问所有模板,您需要确保它们要么具有唯一的基名称,要么需要包含
{define“name}}
操作。

从“一切都简单工作”的默认模板系统移动到Gin有点混乱,即,在使用文件作为模板时,似乎存在一些命名限制。我不知道情况是否如此,但在我的设置中,我必须确保:

  • 模板的名称(定义关键字)需要是文件名-至少当这是模板中唯一的定义时(我没有测试过多个定义)-也就是说,如果你使用
    /templates/book.html
    作为模板,你需要有
    {define“book.html”}
    位于该文件顶部(对于其他模板中包含的模板也是如此;我没有尝试使用
    或其他更深奥的方法将模板组合在一起)
  • 类似地,在调用
    c.HTML(http.StatusOK,“book.HTML”,book)
    时,必须输入包含该模板的文件的全名(如图所示!)
换句话说,尽管手册中另有说明,@mkopriva确认了手册中的内容,但我有一个不同的体验:我只是开始将文件名与
define
c.HTML()
调用相匹配,才停止了获取空白页面


此外,在从控制台运行时(在调试模式下),很明显我的程序“查找”的模板远远超过了它应该找到的数量——即,几乎每个模板都是重复的(一个副本用于文件名,另一个副本用于定义
等)。这不仅让我感到困惑,也让应用程序本身感到困惑……

什么叫“我一无所获”?没有错误?空输出?请务必包括您如何尝试执行模板。目标是。您没有检查
t.Execute()
返回的错误。请这样做。
func getBook(c *gin.Context) {
//DB stuff
var book models.Book
t, err := template.ParseFiles("templates/book.html")
if err != nil {
    log.Println(err)
}
t.Execute(c.Writer, book)
}
c.HTML(http.StatusOK, "book.html", book)