标签: go-templates

转到模板:覆盖结构切片而不是切片结构

稍微使用了Golang的HTML模板,我发现在模板中循环对象的所有示例都是将切片的结构传递给模板,有点像这个示例:

type UserList struct {
    Id   []int
    Name []string
}

var templates = template.Must(template.ParseFiles("main.html"))

func rootHandler(w http.ResponseWriter, r *http.Request) {
    users := UserList{
        Id:   []int{0, 1, 2, 3, 4, 5, 6, 7},
        Name: []string{"user0", "user1", "user2", "user3", "user4"},
    }
    templates.ExecuteTemplate(w, "main", &users)
}
Run Code Online (Sandbox Code Playgroud)

使用"主"模板:

{{define "main"}}
    {{range .Name}}
        {{.}}
    {{end}}
{{end}}
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我不明白如果我只在.Name属性上,我应该如何显示其相应名称旁边的每个ID.我会发现将每个用户视为一个对象,在显示时对其属性进行分组更合乎逻辑.

因此我的问题:

现在,如果我想将一片结构传递给模板怎么办?使这项工作的语法是什么?我还没有找到或理解如何在官方的html /模板文档中.我想象这样的东西像这样:

type User struct {
    Id   int
    Name string
}
type UserList []User
var myuserlist UserList = ...
Run Code Online (Sandbox Code Playgroud)

和模板看起来有点像这样:(这里的语法故意错,只是为了理解)

{{define "main"}}
    {{for each User from …
Run Code Online (Sandbox Code Playgroud)

html templates struct go go-templates

13
推荐指数
1
解决办法
3万
查看次数

Go模板:无法评估Y类型中的字段X(X不是Y的一部分,但卡在{{range}}循环中)

类似的问题在这里得到了回答,但我不认为它解决了我的问题.

假设你有以下结构:

type User struct {
    Username string
    Password []byte
    Email string
    ...
}
Run Code Online (Sandbox Code Playgroud)

此外,URL的结构如下:example.com/en/users,其中"en"是一个URL参数,将被传递到模板中,如下所示:

renderer.HTML(w, http.StatusOK, "users/index", map[string]interface{}{
  "lang":  chi.URLParam(r, "lang"),
  "users": users})
Run Code Online (Sandbox Code Playgroud)

在HTML模板中,我有以下内容:

{{ range .users }}
  <form action="/{{ .lang }}/users" method="POST">
    <input type="text" name="Username" value="{{ .Username }}">
    <input type="text" name="Email" value="{{ .Email }}">
  </form>
{{ end }}
Run Code Online (Sandbox Code Playgroud)

现在,问题是因为{{.lang}}不是User结构的一部分,所以我得到了错误..那么如何在{{range .users}}中访问{{.lang}}?

go go-templates

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

Helm _helpers.tpl:在其他模板定义中调用已定义的模板

Helm _helpers.tpl?

Helm允许在Kubernetes的资源文件中使用Go模板.

名为的文件_helpers.tpl通常用于使用以下语法定义Go模板助手:

{{- define "yourFnName" -}}
{{- printf "%s-%s" .Values.name .Values.version | trunc 63 -}}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)

然后您可以在*.yaml资源文件中使用它,如下所示:

{{ template "yourFnName" . }}
Run Code Online (Sandbox Code Playgroud)

问题

如何在其他帮助程序定义中使用我定义的帮助程序?

例如,如果我有一个应用程序名称的帮助程序,并希望在定义中使用它来确定入口主机名?

我尝试过几种不同的方式在其他定义中调用助手.鉴于此基本辅助功能:

{{- define "host" -}}
{{- printf "%.example.com" <Somehow get result of "name" helper here> -}}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方法:

{{- printf "%.example.com" {{ template "name" . }} -}}
{{- printf "%.example.com" {{- template "name" . -}} -}}
{{- printf "%.example.com" ( template "name" . …
Run Code Online (Sandbox Code Playgroud)

templates go go-templates kubernetes kubernetes-helm

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

如何在golang模板上打印JSON?

我需要客户端的对象,所以我使用json.marshal将其转换为JSON并将其打印到模板中.该对象将作为转义的JSON字符串打印.

我期待它,var arr=["o1","o2"]但确实如此var arr="[\"o1\",\"o2\"]"

我知道我可以在客户端使用JSON.parse,但这是唯一的方法吗?

这是我在模板中打印的方式:

{{ marshal .Arr }}

这是我的元帅功能:

"marshal": func(v interface {}) string {
  a, _ := json.Marshal(v)
  return string(a)
},
Run Code Online (Sandbox Code Playgroud)

go go-templates

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

golang模板内的变量

html/text模板中变量的命名空间是什么?我认为变量$x可以改变模板内的值,但是这个例子告诉我我不能.

当我尝试按年度组合锦标赛时我失败了 - 就像这样(http://play.golang.org/p/EX1Aut_ULD):

package main

import (
    "fmt"
    "os"
    "text/template"
    "time"
)

func main() {
    tournaments := []struct {
        Place string
        Date  time.Time
    }{
        // for clarity - date is sorted, we don't need sort it again
        {"Town1", time.Date(2015, time.November, 10, 23, 0, 0, 0, time.Local)},
        {"Town2", time.Date(2015, time.October, 10, 23, 0, 0, 0, time.Local)},
        {"Town3", time.Date(2014, time.November, 10, 23, 0, 0, 0, time.Local)},
    }
    t, err := template.New("").Parse(`
{{$prev_year:=0}}
{{range .}}
    {{with .Date}} …
Run Code Online (Sandbox Code Playgroud)

variables templates go go-templates

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

在缺少的地图键上去模板比较运算符

在尝试键入不存在键的映射时,我无法找到有关返回值类型的任何文档.从Go bug跟踪器看来它似乎是一种特殊的"无价值"

我正在尝试使用该eq函数比较两个值,但如果该键不存在则会出错

例:

var themap := map[string]string{}  
var MyStruct := struct{MyMap map[string]string}{themap}

{{if eq .MyMap.KeyThatDoesntExist "mystring"}}
  {{.}}
{{end}
Run Code Online (Sandbox Code Playgroud)

结果是 error calling eq: invalid type for comparison

从这里我假设nil值不是""Go 字符串中的空字符串.

有没有一种简单的方法来比较可能不存在的地图值和另一个值?

dictionary go go-templates

12
推荐指数
1
解决办法
4093
查看次数

当"{"或"}"位于模板的静态部分时,如何执行Golang模板?

我的问题是,我想构建一个字母生成器,它首先从用户输入构建一个latex文件,然后通过latex将其编译为PDF.

模板包含多行,如下所示:

\setkomavar{signature}{{{.Name}}}
Run Code Online (Sandbox Code Playgroud)

latex部分\setkomavar{signature}{},而template部分来自走的是{{.Name}}.

当我尝试加载模板时,它会抛出此错误:

恐慌:模板:letter.tmpl:72:命令中出现意外的"}"

有没有一个技巧可以帮助解析器处理这种情况?

提前致谢,

蒂诺

latex go go-templates

11
推荐指数
1
解决办法
1317
查看次数

在 Go 模板中使用 include inside range (helm)

我有一个通过range迭代渲染多次的模板,我可以$.Release.Name毫无问题地访问变量外部变量。但是,当我包含模板时,我无法让它工作:

{{ range $key, $val := $.Values.resources }}
      ...
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/secrets.yaml") . | sha256sum }}
{{ end }}
Run Code Online (Sandbox Code Playgroud)

并在secrets.yaml

apiVersion: "v1"
kind: "Secret"
metadata:
  name: {{ $.Release.Name }}-secrets
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Error: render error in "botfront-project/templates/deployment.yaml": template: [filename] :19:28: executing [filename] at <include (print $.Template.BasePath "/secrets.yaml") .>: error calling include: template: .../secrets.yaml:4:19: executing ".../secrets.yaml" at <$.Release.Name>: nil pointer evaluating interface {}.Name

Run Code Online (Sandbox Code Playgroud)

如何访问包含模板中的变量?

go-templates kubernetes-helm

11
推荐指数
1
解决办法
3618
查看次数

如何在 Helm Chart 中使用 if 条件

我在values.yaml中有以下值

  pg_hba:
    - hostssl all all 0.0.0.0/0 md5
    - host    all all 0.0.0.0/0 md5
Run Code Online (Sandbox Code Playgroud)

要求是检查该hostssl行是否存在,如果是,则应进入 if 循环并执行某些操作。

我尝试使用{{ if has "hostssl" .Values.pg_hba }} ,但它仅搜索确切的字符串“hostssll”,而不是整行。

请帮助我如何检查 if 条件下的整行。

go-templates kubernetes-helm

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

什么是,什么用例都有点“。” 在掌舵图中?

我目前正在阅读 helm 的文档,点 (.) 至少有 3 种不同的用途,是否有任何具体定义?它与 bash 使用(实际文件夹/文件)有什么共同之处吗?

文档中的一些案例

这会打印之前调用的范围内的访问文件吗?

  {{- $files := .Files }}
  {{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
  {{ . }}: |-
    {{ $files.Get . }}
  {{- end }}
Run Code Online (Sandbox Code Playgroud)

这告诉“mychart.app”使用当前文件夹中的文件(类似 bash 的行为)

{{ include "mychart.app" . | indent 4 }}
Run Code Online (Sandbox Code Playgroud)

而这个,我想它从整个文件夹中获取值???我想这是不正确的,因为它不起作用(当时是另一名员工制作的,我必须修复它)

{{- define "read.select-annot" -}}
{{- range $key, $value := . }}
{{ $key }}: {{ $value }}
{{- end }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

go-templates kubernetes kubernetes-helm

11
推荐指数
1
解决办法
2685
查看次数