我想在范围循环中比较字符串类型的两个变量,如下所示:
<select name="category" id="category">
{{range $c := .cats}}
<option value="{{$c.Title}}" {{ if eq $c.Title .category}}active{{end}}>{{$c.Title}}</option>
{{end}}
</select>
$c.Title
和category
都是控制器调度的字符串。
然而,相反,在渲染模板中的下拉菜单中,我得到:
无法评估类型model.category
中的字段类别
$c
属于结构类型类别:
type Category struct {
ID int `db:"id"`
Title string `db:"title"`
Slug string `db:"slug"`
CreatedAt time.Time `db:"created_at"`
}
当我在上面的代码中直接输入category
而不是.category
的字符串值时,没有问题。
我使用gowebapp MVC框架,如果它确实重要。
我该如何解决这个问题?
答案 0 :(得分:7)
您要与之比较的.category
值不属于model
,但模板引擎会尝试解析.category
,因为category
是一个字段或方法您的model
值。
这是因为{{range}}
操作将点.
设置为每次迭代中的连续元素。
要引用顶级category
,您可以使用$
这样的符号:
<select name="category" id="category">
{{range $c := .cats}}
<option value="{{$c.Title}}" {{ if eq $c.Title $.category}}active{{end}}>{{$c.Title}}</option>
{{end}}
</select>
请参阅此可运行示例:
func main() {
t := template.Must(template.New("").Parse(src))
params := map[string]interface{}{
"category": "Cars",
"cats": []struct{ Title string }{
{"Animals"}, {"Cars"}, {"Houses"},
},
}
if err := t.Execute(os.Stdout, params); err != nil {
panic(err)
}
}
const src = `<select name="category" id="category">
{{range $c := .cats}}
<option value="{{$c.Title}}" {{ if eq $c.Title $.category}}active{{end}}>{{$c.Title}}</option>
{{end}}
</select>`
输出(在Go Playground上尝试):
<select name="category" id="category">
<option value="Animals" >Animals</option>
<option value="Cars" active>Cars</option>
<option value="Houses" >Houses</option>
</select>