当前位置: 首页 > 面试题库 >

Golang模板引擎管道

叶茂才
2023-03-14
问题内容

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

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

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

{{ template "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 -}}。这也是一种管道吗?

先感谢您!


问题答案:

有2个template软件包,text/templatehtml/template

它们具有相同的接口,但是该html/template程序包用于生成安全的HTML输出,以防止代码注入,因此应使用该程序包,而不是text/template在输出为HTML时使用。

由于它们具有相同的界面,但是html/template提供了一些额外的功能(对插入的数据进行上下文转义),因此仅在上记录了基础知识和原理text/html,而html/template大多数文献则集中在详细说明额外内容上。

话虽如此,“管道”属于基础。它记录在管道text/template部分:

流水线

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

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将表示struct字段(Name如果存在)或其命名为的方法Name()

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

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

因此,在处理/渲染模板时,点可能会更改,并且“仅”指向最初传递给模板执行的部分值。通常它很方便,或者仍然需要达到原始值,而不仅仅是光标。为此,模板包提供了$

开始执行时,将$设置为传递给Execute的数据html" target="_blank">参数,即dot的起始值。

因此,即使您位于{{range}}例如(将点设置为要遍历的数组/ slice
/映射的连续元素)内,您仍然可以伸手并引用传递给该对象的值的任何其他部分模板执行。

因此,例如,如果您遍历像这样的书{{range .Books}},并且需要Name原始传递的struct
的字段,则可以在内部执行{{range}}以下操作:

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


 类似资料:
  • 具体查看ejs官方文档 https://github.com/mde/ejs

  • 我们自己实现了一个轻量级的模板引擎,不要问为什么不用smart之类的,因为我们认为没有必要为了一个小小的模板引擎而引入smaart这样复杂的实现。你可能会说,smart功能强大,支持各种标签,标签也是很强大,而且还可以对模板引擎进行各种"灵活"的配置... 这里我们觉得有必要说明一下: 框架的内置模板引擎基本上实现了我们日常开中所有常用的标签。 不常用的标签我们也做了巧妙的实现。 我们只提供了扩展

  • 内置模板引擎 视图的模板文件可以支持不同的解析规则,默认情况下无需手动初始化模板引擎。 可以通过下面的几种方式对模板引擎进行初始化。 配置文件 内置模板引擎的参数统一在配置目录的template.php文件中配置,例如: return [ // 模板引擎类型 支持 php think 支持扩展 'type' => 'Think', // 模板路径 '

  • Warning: The packages listed below may be outdated, no longer maintained or even broken. Listing here does not constitute an endorsement or recommendation from the Expressjs project team. Use at your

  • Use the app.engine(ext, callback) method to create your own template engine. ext refers to the file extension, and callback is the template engine function, which accepts the following items as parame

  • hi-nginx-java内置了两个mustache模板引擎:mustache.java和jmustache。 以下介绍仅就jmustache而言。 字符串模板 字符串模板是最简单的情况。例如: package test; import hi.request; import hi.response; import hi.route; import java.util.regex.Matcher