![](/img/trans.png)
[英]How can I prevent non-nil values triggering a golang template if nil block
[英]How can I override a template block with an empty template?
使用text/html
我定義了一個block
在我的基礎模板,包含默認內容。 在某些情況下,我希望這個塊是空的,所以我想我可以重新定義它的名字並使它包含如下:
{{ block "something" . }}
<h1>Default content</h1>
{{ end }}
// later in a place that does not want "something" ...
{{ define "something" }}{{ end }}
不知怎的,Go似乎認為這個定義是“零”並且仍然會呈現默認內容,除非我將任何非空白內容放入定義中。
我在Golang repo上發現了這個問題,它在Playground示例中很好地描述了同樣的事情:
package main
import (
"fmt"
"os"
"runtime"
"text/template"
)
func main() {
fmt.Printf("Version: %q\n", runtime.Version())
t, err := template.New("master").Parse(`{{block "area51" .}}Original Content{{end}}`)
if err != nil {
panic(err)
}
t, err = t.New("other_template").Parse(`{{define "area51"}}{{end}}`)
if err != nil {
panic(err)
}
fmt.Printf("Output:\n")
if err := t.ExecuteTemplate(os.Stdout, "master", nil); err != nil {
panic(err)
}
fmt.Printf("\n")
}
奇怪的是,這個問題提到它是固定的(如果我理解正確的話,它會落在1.8.1中),但它不適用於我,無論是1.8.1 +還是1.9。
這是Golang中的一個錯誤還是方法存在缺陷? 我是否需要以不同的方式執行任何操作才能重新定義塊以使其呈現為空?
這是預期的行為。 這在Template.Parse()
:
在第一次使用Execute on t或任何相關模板之前,可以在連續調用Parse時重新定義模板。 包含僅包含空格和注釋的正文的模板定義被視為空,不會替換現有模板的正文。 這允許使用Parse添加新的命名模板定義而不覆蓋主模板主體。
因此,您無法“擦除”已定義的模板(您無法將其內容替換為空)。
如果您“有條件地”需要它,則使用{{if}}
操作來決定是否要調用模板。 或者,您可以在模板中放置{{if}}
,模板本身可以選擇不渲染任何內容。 在這種情況下,您必須確保傳遞控制模板將呈現的內容的正確參數。
PS如果你正在使用HTML模板,你應該總是使用html/template
而不是text/template
,因為前者提供與包text/template
相同的接口,但也提供了上下文轉義以生成HTML輸出,以防止代碼注入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.