我想使用html/template在一个范围内运行一个范围。示例代码(https://go.dev/play/p/fxx61RwIDhd)如下所示:
package main
import (
"html/template"
"os"
)
type Runtest struct {
ID int
SessionType string
}
type Setting struct {
ID int
Type string
}
type templateData struct {
Runtest []*Runtest
Setting []*Setting
}
func main() {
tmpl := template.Must(template.New("nested-range").Parse(`
{{ range .Runtest }}
<h1>Runtest ID: {{ .ID }}, Session Type: {{ .SessionType }}</h1>
<ul>
{{ range .Setting }}
<li>Setting ID: {{ .ID }}, Type: {{ .Type }}</li>
{{ end }}
</ul>
{{ end }}
`))
runtestsList := []*Runtest{
{ID: 1, SessionType: "Type A"},
{ID: 2, SessionType: "Type B"},
}
settingsList := []*Setting{
{ID: 101, Type: "Setting 1"},
{ID: 102, Type: "Setting 2"},
{ID: 201, Type: "Setting X"},
{ID: 202, Type: "Setting Y"},
}
data := templateData{
Runtest: runtestsList,
Setting: settingsList,
}
err := tmpl.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}
我在执行代码时得到以下错误:
panic: template: nested-range:5:13: executing "nested-range" at <.Setting>: can't evaluate field Setting in type *main.Runtest
模板引擎似乎将{{ range .Setting }}视为{{ range .Runtest }}的一部分。
如果你只尝试一个范围,代码将工作:https://go.dev/play/p/CUOxnBfvAo1
也是一个接一个的范围:https://go.dev/play/p/mge2JsQYOYD
是否可以使用不属于第一个范围数据的数据运行范围内的范围?
1条答案
按热度按时间ss2ws0br1#
这是一个范围问题。
range
启动一个新的作用域,迭代变量为.
。也就是说,当你有您仍然可以使用
$
前缀引用全局范围中的变量:或者,您可以自己定义循环变量。如果您有多个级别的
range
,并且您需要访问其中一个封闭变量中定义的变量,则这一点特别有用: