问题在于,即使您在这种情况下使用循环变量(和),
{{range}}操作也会更改(设置)点(.)。在圆点内部设置为当前元素。
$key``$value``{{range}}在里面
{{range}}写:{{ if eq $key .Res.Type }}由于循环中的
string值是值,因此
.Res.Type是错误的,因为没有值的
Res字段或方法
string(当前元素由点表示
.)。
使用
$符号不引用循环值,而是引用传递给模板执行的参数:
{{ if eq $key $.Res.Type }}这会起作用,但不会产生所需的输出,因为您有错字:
res := &Result{Type: "findAllString"}使用大写字母,
Result因为您的
types地图还包含带有大写字母的值:
res := &Result{Type: "FindAllString"}这样,您将获得所需的输出(在Go Playground上尝试):
2009/11/10 23:00:00 <select name="type"> <option value="FindAllString" selected>FindAllString</option> <option value="FindString">FindString</option> <option value="FindStringSubmatch">FindStringSubmatch</option> </select>
还请注意,您可以像这样简单地编写循环:
{{range $key, $value := .Types}} <option value="{{$key}}"{{if eq $key $.Res.Type}} selected{{end}}>{{.}}</option>{{end}}还要注意,出于测试目的,您可以简单地通过
os.Stdout编写者身份来执行模板,并且无需创建和使用缓冲区即可在控制台上看到结果,例如:
err = t.Execute(os.Stdout, struct { Types map[string]string Res *Result}{types, res})在Go Playground上尝试简化版本。



