是否可以{{range pipeline}} T1 {{end}}在text/template包中的操作中访问范围操作之前的管道值,或者将父/全局管道作为参数传递给Execute?
显示我尝试做的工作示例:
package main
import (
"os"
"text/template"
)
// .Path won't be accessible, because dot will be changed to the Files element
const page = `{{range .Files}}<script src="{{html .Path}}/js/{{html .}}"></script>{{end}}`
type scriptFiles struct {
Path string
Files []string
}
func main() {
t := template.New("page")
t = template.Must(t.Parse(page))
t.Execute(os.Stdout, &scriptFiles{"/var/www", []string{"go.js", "lang.js"}})
}
Run Code Online (Sandbox Code Playgroud)
我已经按照本教程:http://golang.org/doc/articles/wiki/final.go并根据我的需要稍微修改了它.问题是我想在模板中支持HTML.我意识到这是一个安全风险,但目前并不是一个问题.
页面呈现的结果:
<h1>this<strong>is</strong>a test</h1>
Run Code Online (Sandbox Code Playgroud)
让我解释一下代码:
type Page struct {
Title string
Body []byte
}
Run Code Online (Sandbox Code Playgroud)
我想要存储HTML的数据存储在Page.Body.这是类型[]byte,这意味着我不能(或我可以?)运行,html/template.HTML(Page.Body)因为该函数需要一个字符串.
我有这个预呈现模板:
var (
templates = template.Must(template.ParseFiles("tmpl/edit.html", "tmpl/view.html"))
)
Run Code Online (Sandbox Code Playgroud)
而实际ExecuteTemplate看起来像这样:
err := templates.ExecuteTemplate(w, tmpl+".html", p)
Run Code Online (Sandbox Code Playgroud)
其中w是w http.ResponseWriter,tmpl是tmpl string,而p是p *Page
最后我的'view.html'(模板)如下所示:
<h1>{{.Title}}</h1>
<p>[<a href="/edit/{{.Title}}">edit</a>]</p>
<div>{{printf "%s" .Body}}</div>
Run Code Online (Sandbox Code Playgroud)
我尝试过的事情:
{{printf "%s" .Body | html}} 什么都不做 github.com/russross/blackfriday(Markdown处理器)并运行p.Body = blackfriday.MarkdownCommon(p.Body)了正确将Markdown转换为HTML,但HTML仍然作为实体输出.编辑:我尝试了下面的代码(我不知道为什么格式混乱),它仍然输出完全相同.
var s template.HTML
s = …
如何在模板内的if语句中有多个条件?
我试过这段代码:
{{ if .condition1 && .condition2 }}
<!-- SHOW SOMETHING -->
{{ end }}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.(事实上它是恐慌)
例如,我有
package main
import "html/template"
import "net/http"
func handler(w http.ResponseWriter, r *http.Request) {
t, _ := template.ParseFiles("header.html", "footer.html")
t.Execute(w, map[string] string {"Title": "My title", "Body": "Hi this is my body"})
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
Run Code Online (Sandbox Code Playgroud)
在header.html中:
Title is {{.Title}}
Run Code Online (Sandbox Code Playgroud)
在footer.html中:
Body is {{.Body}}
Run Code Online (Sandbox Code Playgroud)
去的时候http://localhost:8080/,我只看到"标题是我的标题",而不是第二个文件footer.html.如何使用template.ParseFiles加载多个文件?最有效的方法是什么?
提前致谢.
我试图在Go模板中实现一个非常简单的事情并且失败!
该range操作允许我迭代数组及其从零开始的索引,如下所示:
{{range $index, $element := .Pages}}
Number: {{$index}}, Text: {{element}}
{{end}}
Run Code Online (Sandbox Code Playgroud)
但是,我正在尝试输出从1开始计数的索引.我的第一次尝试失败:
Number: {{$index + 1}}
Run Code Online (Sandbox Code Playgroud)
这会引发illegal number syntax: "+"错误.
我查看了go-lang官方文档,但没有找到任何与模板内部算术运算有关的内容.
我错过了什么?
如何在值文件中创建一个可选块,然后在模板中引用它?
例如,假设我有一个如下所示的值文件:
# values.yaml
foo:
bar: "something"
Run Code Online (Sandbox Code Playgroud)
然后我有一个如下所示的 helm 模板:
{{ .Values.foo.bar }}
Run Code Online (Sandbox Code Playgroud)
如果我想让值文件中的 foo.bar 成为可选怎么办?如果foo键不存在于值中,则会引发错误。
我试过添加为 if 条件。但是,如果foo缺少密钥,这仍然会失败:
{{ if .Values.foo.bar }}
{{ .Values.foo.bar }}
{{ end }}
Run Code Online (Sandbox Code Playgroud)
任何想法都非常感谢。
说我有这些价值观
grafana:
...
ingress:
enabled: true
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths: ["/grafana"]
Run Code Online (Sandbox Code Playgroud)
这是标准的头盔。出于这个原因,我想保留hosts为一个数组(即使它使接下来的移动有点棘手)。我怎样才能获得第一个.host(我不介意任何可能的其他)才能使env.value动态
containers:
- name: {{ .Chart.Name }}-grafana
env:
- name: GF_DOMAIN
value: chart-example.local
Run Code Online (Sandbox Code Playgroud)
我试过
env:
- name: GF_DOMAIN
{{- range .Values.grafana.ingress.hosts }}
value: {{ .host }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)
env:
{{- range .Values.grafana.ingress.hosts }}
- name: GF_DOMAIN
value: {{ .host }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)
按照这个建议,我也尝试过
env:
{{- with .Values.grafana.ingress.hosts 0}} …Run Code Online (Sandbox Code Playgroud) 在html/template(和text/template)包中,template.New具有以下签名:
func New(name string) *Template
Run Code Online (Sandbox Code Playgroud)
究竟name用于什么?我已经扫描了文档(以及一些来源),但无济于事.我只是用空字符串实例化我的所有模板,它似乎没有什么区别.我为什么要打扰一个名字?
即使对于命名模板,这两者似乎是等价的:
template.Must(template.New("").Parse(`{{ define "body" }}Body{{ end }}`))
template.Must(template.New("body").Parse(`Body`))
Run Code Online (Sandbox Code Playgroud)
我该怎么做这样的事情:
{{ $use_ssl := (ne $.Env.CERT_NAME "") }}
Run Code Online (Sandbox Code Playgroud)
哪里$.Env.CERT_NAME可能是零/未定义.如果它是nil,则会出现此错误:
at <ne $.Env.CERT_NAME "">: error calling ne: invalid type for comparison
Run Code Online (Sandbox Code Playgroud)
注意:我无法控制传入Go模板的对象,因此必须在模板本身内完全解决这个问题.
我试图通过首先检查它是否为非空来解决:
{{ $use_ssl := ( ($.Env.CERT_NAME) && (ne $.Env.CERT_NAME "") ) }}
Run Code Online (Sandbox Code Playgroud)
但它给出了这个错误:
unexpected "&" in operand
Run Code Online (Sandbox Code Playgroud)
所以我切换到这个,这在语法上是允许的:
{{ $use_ssl := (and ($.Env.CERT_NAME) (ne $.Env.CERT_NAME "") ) }}
Run Code Online (Sandbox Code Playgroud)
但后来我失去了我对操作员的短路评估,我&&又回到了这个错误:
at <ne $.Env.CERT_NAME ...>: error calling ne: invalid type for comparison
Run Code Online (Sandbox Code Playgroud)
好吧,我想,如果我不能用一个漂亮的单行,并且Go没有三元运算符,那很好,我只会用惯用的Go方式来做,这显然是if/else.
{{ if $.Env.CERT_NAME }} …Run Code Online (Sandbox Code Playgroud) 我试图改变一个变量的值,如果它设置的另一个变量是通过将两个变量组合在中间的一个短划线,我不确定这样做的语法,我想到的事情如下:
{{- $serviceNamespace := .Values.serviceNamespace -}}
{{- $serviceTag := .Values.serviceTag -}}
{{- if $serviceTag}}
{{- $serviceNamespace := .Values.serviceNamespace "-" .Values.serviceTag -}}
{{- end}}
Run Code Online (Sandbox Code Playgroud)
它是否正确?如果serviceNamespace是hello,serviceTag那1.0.0我最终会serviceNamespace成为hello-1.0.0?