稍微使用了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) 类似的问题在这里得到了回答,但我不认为它解决了我的问题.
假设你有以下结构:
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}}?
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) 我需要客户端的对象,所以我使用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) 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) 在尝试键入不存在键的映射时,我无法找到有关返回值类型的任何文档.从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 字符串中的空字符串.
有没有一种简单的方法来比较可能不存在的地图值和另一个值?
我的问题是,我想构建一个字母生成器,它首先从用户输入构建一个latex文件,然后通过latex将其编译为PDF.
模板包含多行,如下所示:
\setkomavar{signature}{{{.Name}}}
Run Code Online (Sandbox Code Playgroud)
该latex部分\setkomavar{signature}{},而template部分来自走的是{{.Name}}.
当我尝试加载模板时,它会抛出此错误:
恐慌:模板:letter.tmpl:72:命令中出现意外的"}"
有没有一个技巧可以帮助解析器处理这种情况?
提前致谢,
蒂诺
我有一个通过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)
如何访问包含模板中的变量?
我在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 条件下的整行。
我目前正在阅读 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 ×10
go ×7
templates ×3
kubernetes ×2
dictionary ×1
html ×1
latex ×1
struct ×1
variables ×1