"range" 操作和 "pipeline" 说明在 text/html 模板包中。戈朗
"range" action and "pipeline" clarification in text/html template package. Golang
我试图在 text/html 模板包中获得一些优点。我已经从 golang 站点阅读了它的文档。很难理解 . (点)在一般和一定时间范围内行动。具体是什么意思"pipeline",可能因为我的英文不是母语,所以比较难理解):
{{pipeline}}
The default textual representation of the value of the pipeline
is copied to the output.
让我们考虑一个例子:
data := map[string]interface{}{
"struct": &Order{
ID: 1,
CustID: 2,
Total: 3.65,
Name: "Something",
},
"name1": "Timur",
"name2": "Renat",
}
t.ExecuteTemplate(rw, "index", data)
这里是"index":
{{define "index"}}
{{range $x := .}}
{{.}}
<b>{{$x}}</b><br>
<i>{{$.struct.ID}}</i><br>
<br>
# the lines below don't work and break the loop
# {{.ID}}
# or
# {{.struct.ID}}
# what if I want here another range loop that handles "struct" members
# when I reach "struct" field in the data variable or just do nothing
# and just continue the loop?
{{end}}
{{end}}
输出:
帖木儿
帖木儿
1
雷纳特
雷纳特
1
{1 2 3.65 东西}
{1 2 3.65 东西}
1
管道
模板包中的管道与您在命令行中执行的操作相同"piping"。
例如,这是在 Mac:
上为您的 NIC 分配默认网关的一种方法
route -n get default | grep 'gateway' | awk '{print }'
基本上,route -n get default
是第一个 运行。管道字符 |
表示 "take the output of the route
command, and shove it into the grep
command",而不是将结果打印到控制台。此时,grep 'gateway'
运行 收到来自 route
的输入。 grep
的输出然后被推入 awk
。最后,由于没有更多的管道,您在屏幕上看到的唯一输出就是 awk
想要打印的内容。
这在模板包中有点相同。您可以将值通过管道传递给方法调用并将它们链接在一起。如:
{{ "Hello world!" | printf "%s" }}
相当于{{ printf "%s" "Hello World!" }}
See an example in the Go Playground here
基本上,
{{ "Hello World!" | printf "%s" }}
^^^^^^^^^^^^ ^^^^^^^^^^
|__________________________|
这在函数式语言中很常见(据我所见..我知道它在 F# 中很常见)。
点.
圆点是"contextually aware"。这意味着它会根据您放置的位置改变含义。当您在模板的正常区域使用它时,它就是您的模型。当您在 range
循环中使用它时,它会成为迭代的当前值。
See an example in the Go Playground here
在链接示例中,仅在循环、$x
和.
范围内是相同的。循环结束后,点指回传递到模板中的模型。
正在检查 "struct"
你的结构是一个键值对……map
。为此,您需要确保在范围循环中提取这两个部分:
{{ range $key, $value = . }}
这将在每次迭代时为您提供键和值。之后,你只需要检查是否相等:
{{ if eq $key "struct" }}
{{ /* $value.ID is the ID you want */ }}
See an example on the Go Playground here
希望对您有所帮助。
我试图在 text/html 模板包中获得一些优点。我已经从 golang 站点阅读了它的文档。很难理解 . (点)在一般和一定时间范围内行动。具体是什么意思"pipeline",可能因为我的英文不是母语,所以比较难理解):
{{pipeline}}
The default textual representation of the value of the pipeline
is copied to the output.
让我们考虑一个例子:
data := map[string]interface{}{
"struct": &Order{
ID: 1,
CustID: 2,
Total: 3.65,
Name: "Something",
},
"name1": "Timur",
"name2": "Renat",
}
t.ExecuteTemplate(rw, "index", data)
这里是"index":
{{define "index"}}
{{range $x := .}}
{{.}}
<b>{{$x}}</b><br>
<i>{{$.struct.ID}}</i><br>
<br>
# the lines below don't work and break the loop
# {{.ID}}
# or
# {{.struct.ID}}
# what if I want here another range loop that handles "struct" members
# when I reach "struct" field in the data variable or just do nothing
# and just continue the loop?
{{end}}
{{end}}
输出:
帖木儿
帖木儿
1
雷纳特
雷纳特
1
{1 2 3.65 东西}
{1 2 3.65 东西}
1
管道
模板包中的管道与您在命令行中执行的操作相同"piping"。
例如,这是在 Mac:
上为您的 NIC 分配默认网关的一种方法route -n get default | grep 'gateway' | awk '{print }'
基本上,route -n get default
是第一个 运行。管道字符 |
表示 "take the output of the route
command, and shove it into the grep
command",而不是将结果打印到控制台。此时,grep 'gateway'
运行 收到来自 route
的输入。 grep
的输出然后被推入 awk
。最后,由于没有更多的管道,您在屏幕上看到的唯一输出就是 awk
想要打印的内容。
这在模板包中有点相同。您可以将值通过管道传递给方法调用并将它们链接在一起。如:
{{ "Hello world!" | printf "%s" }}
相当于{{ printf "%s" "Hello World!" }}
See an example in the Go Playground here
基本上,
{{ "Hello World!" | printf "%s" }}
^^^^^^^^^^^^ ^^^^^^^^^^
|__________________________|
这在函数式语言中很常见(据我所见..我知道它在 F# 中很常见)。
点.
圆点是"contextually aware"。这意味着它会根据您放置的位置改变含义。当您在模板的正常区域使用它时,它就是您的模型。当您在 range
循环中使用它时,它会成为迭代的当前值。
See an example in the Go Playground here
在链接示例中,仅在循环、$x
和.
范围内是相同的。循环结束后,点指回传递到模板中的模型。
正在检查 "struct"
你的结构是一个键值对……map
。为此,您需要确保在范围循环中提取这两个部分:
{{ range $key, $value = . }}
这将在每次迭代时为您提供键和值。之后,你只需要检查是否相等:
{{ if eq $key "struct" }}
{{ /* $value.ID is the ID you want */ }}
See an example on the Go Playground here
希望对您有所帮助。