Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何使用空模板替代模板块?_Go_Go Templates - Fatal编程技术网

Go 如何使用空模板替代模板块?

Go 如何使用空模板替代模板块?,go,go-templates,Go,Go Templates,使用text/html我在基本模板中定义了一个块,其中包含默认内容。在某些情况下,我希望此块为空,因此我认为可以重新定义其名称,使其不包含以下内容: {{ block "something" . }} <h1>Default content</h1> {{ end }} // later in a place that does not want "something" ... {{ define "something" }}{{ end }} 奇怪的是,这个

使用
text/html
我在基本模板中定义了一个
,其中包含默认内容。在某些情况下,我希望此块为空,因此我认为可以重新定义其名称,使其不包含以下内容:

{{ block "something" . }}
    <h1>Default content</h1>
{{ end }}

// later in a place that does not want "something" ...
{{ define "something" }}{{ end }}
奇怪的是,这个问题提到它是固定的(如果我理解正确的话,它会出现在1.8.1中),但它对我不起作用,无论是1.8.1+还是1.9


这是Golang中的一个bug还是该方法有缺陷?为了重新定义块,使其呈现为空,是否需要执行任何不同的操作?

这是预期的行为。该文件记录在:

在第一次使用executeont或任何相关模板之前,可以在后续的解析调用中重新定义模板正文仅包含空白和注释的模板定义被视为空的,不会替换现有模板的正文。这允许使用解析添加新的命名模板定义,而不会覆盖主模板正文

因此,您不能“擦除”已定义的模板(不能将其内容替换为空)

如果“有条件地”需要它,那么使用
{{{If}}
操作来决定是否调用模板。或者,您可以在模板内部放置一个
{{if}
,模板本身可以选择不渲染任何内容。在这种情况下,必须确保传递控制模板将呈现的内容的正确参数


注意:如果您使用的是HTML模板,则应始终使用而不是,因为前者提供了与package
text/template
相同的界面,但也提供了上下文转义以生成HTML输出,从而防止代码注入

事实上,通过一个小小的hack就可以了——只需在那里输出
{{define“Footer”}}{{{''}}{{end}}
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")

}