Golang模板引擎管道

10

我有一个 Golang 模板,定义如下

{{- define "test" -}}
{{- printf "%s" .Name | trunc 24 -}}
{{- end -}}

然后我在我的文件中使用它:

{{ template "test" . }}

"test." 后面的点是什么意思? Golang模板文档中说:

{{template "name" pipeline}}
The template with the specified name is executed with dot set
to the value of the pipeline.

但我不确定流水线是什么。阅读文档没有结果,有人能再次解释一下吗?

另外,为什么我们必须以点号开头的值?例如:{{-printf“%s”.Name | trunc 24 -}} 。 这也是一种管道吗?

提前谢谢!


大致上:点号“.”代表当前值。这可能是一个结构体或更复杂的东西。如果"."是某个结构体,那么".Name"选择该结构体的名称字段。没有点号,您无法处理原始类型,例如int(int的名称是什么?)。管道是值如何在代码和函数中流动的方式。管道在包文档中有解释。您可以将各种东西链接在一起,这可能会修改您将其放入管道输入的内容。 - Volker
@Volker,那么通过编写 {{template "name" . }} 我是将此模板绑定到当前上下文吗? - Rahul
“将此模板绑定到当前上下文”听起来非常奇怪。您可以使用当前值(即点)执行名称为“name”的模板。 - Volker
1个回答

20

有两个template包,分别是text/templatehtml/template

它们具有相同的接口,但是html/template包是用于生成防止代码注入的HTML输出,并且应该在输出为HTML时使用,而不是text/template

由于它们具有相同的接口,但是html/template提供了一些额外功能(插入数据的上下文转义),因此基础和原则仅在text/html中记录,而html/template的文档大部分侧重于详细说明这些额外功能。

话虽如此,“pipeline”属于基础知识。在text/template,部分Pipelines中记录了它:

Pipelines

管道是“命令”的可能链式序列。命令可以是简单值(参数)或函数或方法调用,可能带有多个参数:

Argument
    The result is the value of evaluating the argument.
.Method [Argument...]
    The method can be alone or the last element of a chain but,
    unlike methods in the middle of a chain, it can take arguments.
    The result is the value of calling the method with the
    arguments:
        dot.Method(Argument1, etc.)
functionName [Argument...]
    The result is the value of calling the function associated
    with the name:
        function(Argument1, etc.)
    Functions and function names are described below.

通过使用管道字符 '|' 将一系列命令分开,可以将"管道"串联在一起。在串联的管道中,每个命令的结果都作为后续命令的最后一个参数传递。管道中最后一个命令的输出就是管道的值。

"参数"和"管道"是数据的评估。

"点号" . 基本上是一个光标,指向执行模板时传递的数据结构中的某个位置。点号的起始值是您传递的值,但此点由许多操作修改,例如{{range}}{{with}}

执行模板时,遍历结构并将表示为句点'.'的光标设置为执行过程中当前位置处的结构中的值。

所以当你写.Name时,意味着你要引用点号当前指向的值的字段、方法或名为Name的键。例如,如果您传递一个struct,在模板开始时,.Name将表示结构字段Name(如果存在)或其名为Name()的方法。

当您调用/包含另一个模板时,有可能告诉要传递给它执行的值。当您编写{{template "something" .}}时,这意味着您希望将点号当前指向的值传递给模板执行。如果您只想传递点号所指向的结构体的Name字段,则可以像这样执行:{{template"something".Name}}

您在{{template}}中作为管道传递的值将成为调用其他模板内部的点。

因此,当处理/渲染模板时,可以更改点,并使其仅指向最初传递给模板执行的值的一部分。通常很方便或需要仍然可以访问原始值而不仅仅是光标。为此,模板包提供了$

当执行开始时,$设置为传递给Execute的数据参数,即点的起始值。

因此,即使您处于例如{{range}}之内(它将点设置为您正在遍历的数组/切片/映射的连续元素),您仍然可以达到并引用传递给模板执行的任何其他部分的值。

因此,例如,如果您正在遍历书籍的切片{{range.Books}},并且需要最初传递的结构的Name字段,则可以在{{range}}内部像这样执行:

{{range .Books}}
    Title: {{.Title}}
    Original name: {{$.Name}}
{{end}}

1
讲解得非常清晰,帮我解决了一些疑问。谢谢。 - Yougeshwar Khatri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接