标签: go-templates

在Go模板中,访问范围内的父/全局管道

是否可以{{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)

play.golang.org

go go-templates

25
推荐指数
1
解决办法
9377
查看次数

去模板.ExecuteTemplate包含html

我已经按照本教程: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 = …

go go-templates

24
推荐指数
3
解决办法
2万
查看次数

if语句Go模板中的多个条件

如何在模板内的if语句中有多个条件?

我试过这段代码:

{{ if .condition1 && .condition2 }}
    <!-- SHOW SOMETHING -->
{{ end }}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.(事实上​​它是恐慌)

go go-templates

20
推荐指数
2
解决办法
1万
查看次数

在golang中使用template.ParseFiles的多个文件

例如,我有

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 go-templates

19
推荐指数
2
解决办法
1万
查看次数

Go模板中的算术

我试图在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官方文档,但没有找到任何与模板内部算术运算有关的内容.

我错过了什么?

go go-templates

19
推荐指数
3
解决办法
2万
查看次数

Helm 可选的嵌套变量

如何在值文件中创建一个可选块,然后在模板中引用它?

例如,假设我有一个如下所示的值文件:

# 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)

任何想法都非常感谢。

go-templates kubernetes kubernetes-helm

18
推荐指数
5
解决办法
1万
查看次数

Helm 模板:获取第一个数组元素的节点

说我有这些价值观

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)

yaml templating go-templates kubernetes-helm

18
推荐指数
1
解决办法
2万
查看次数

去模板名称

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)

https://play.golang.org/p/wKzCHdLf2S

go go-templates

17
推荐指数
2
解决办法
3338
查看次数

如何基于表达式在Go模板中有条件地设置变量,如果没有用if语句包装,可能会导致错误

我该怎么做这样的事情:

{{ $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)

ruby go-templates

16
推荐指数
3
解决办法
5810
查看次数

Kubernetes Helm,将两个变量与中间的字符串组合在一起

我试图改变一个变量的值,如果它设置的另一个变量是通过将两个变量组合在中间的一个短划线,我不确定这样做的语法,我想到的事情如下:

{{- $serviceNamespace := .Values.serviceNamespace -}}
{{- $serviceTag := .Values.serviceTag -}}
{{- if $serviceTag}}
{{- $serviceNamespace := .Values.serviceNamespace  "-" .Values.serviceTag -}}
{{- end}}
Run Code Online (Sandbox Code Playgroud)

它是否正确?如果serviceNamespacehello,serviceTag1.0.0我最终会serviceNamespace成为hello-1.0.0

go-templates kubernetes kubernetes-helm

16
推荐指数
3
解决办法
2万
查看次数

标签 统计

go-templates ×10

go ×6

kubernetes-helm ×3

kubernetes ×2

ruby ×1

templating ×1

yaml ×1