登录
首页 >  Golang >  Go问答

Golang 模板引擎管道

来源:Golang技术栈

时间:2023-03-05 11:40:01 195浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《Golang 模板引擎管道》,就很适合你,本篇文章讲解的知识点主要包括golang。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我有一个 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主要侧重于详细说明额外内容。

话虽如此,“管道”属于基础。它记录在[管道](https://golang.org/pkg/text/template/#hdr- Pipelines)text/template部分:[](https://golang.org/pkg/text/template/#hdr- 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}}or {{with}}

模板的执行遍历结构并设置光标,由句点“.”表示 并称为“点”,随着执行的进行,结构中当前位置的值。

因此,当您编写 时.Name,这意味着 dot 当前指向的值,您要引用它的字段或方法或调用的键Name。例如,如果您struct在模板的开头传递一个 ,.Name将表示结构字段Name(如果存在)或其方法名为Name()

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

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

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

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

因此,即使您在一个{{range}}示例中(它将点设置为您所覆盖的数组/切片/映射的连续元素),您仍然可以伸出手并引用传递给该值的任何其他部分模板执行。

因此,例如,如果您正在阅读诸如 之类的书籍{{range .Books}},并且您需要Name最初传递的结构的字段,则可以{{range}}像这样在内部进行:

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

终于介绍完啦!小伙伴们,这篇关于《Golang 模板引擎管道》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>