在传递给模板的数据中,我有两个变量Type
,Res.Type
我想进行比较以为select字段预选择一个选项。
为了说明我的问题,我创建了这个简化的版本:
package main
import (
"bufio"
"bytes"
"html/template"
"log"
)
type Result struct{ Type string }
func main() {
types := map[string]string{
"FindAllString": "FindAllString",
"FindString": "FindString",
"FindStringSubmatch": "FindStringSubmatch",
}
res := &Result{Type: "findAllString"}
templateString := `
<select name="type">
{{ range $key,$value := .Types }}
{{ if eq $key .Res.Type }}
<option value="{{$key}}" selected>{{$value}}</option>
{{ else }}
<option value="{{$key}}">{{$value}}</option>
{{ end }}
{{ end }}
</select>`
t, err := template.New("index").Parse(templateString)
if err != nil {
panic(err)
}
var b bytes.Buffer
writer := bufio.NewWriter(&b)
err = t.Execute(writer, struct {
Types map[string]string
Res *Result
}{types, res})
if err != nil {
panic(err)
}
writer.Flush()
log.Println(b.String())
}
它应该选择"FindAllString"
选项,但只会产生错误
panic: template: index:4:21: executing "index" at <.Res.Type>: can't evaluate field Res in type string
goroutine 1 [running]:
panic(0x53f6e0, 0xc4200144c0)
/usr/local/go/src/runtime/panic.go:500 +0x1a1
main.main()
/home/tobias/ngo/src/github.com/gamingcoder/tmp/main.go:41 +0x523
exit status 2
当我只比较两个正常的字符串时,它可以工作,但是我想知道是否有一种方法。我已经看到您可以向模板添加功能,但是我认为必须有一种更简单的方法。
问题在于,即使您在这种情况下使用循环变量(和),{{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上尝试简化版本。
问题内容: 给定我有两个变量,它们的值分别为“ test”和“ test”。在jinja2中,当我尝试使用if比较它们时,没有任何显示。我做如下比较: 我得到的输出怎么了,我该如何比较? 问题答案: 只需使用诸如或https://stackoverflow.com/a/19993378/1232796的过滤器 在你的情况下,你想做
问题内容: 我有以下模板: 我在执行模板时传递了一个字符串。 但是,出现以下错误: 如何比较模板中的字符串? 问题答案: 是函数,而不是运算符。它以以下形式调用:(不是)。 您可以通过将操作数从的侧面移动到之后来修复模板:
为什么结构体作为map的值,不能通过map[key].成员属性 = "Xxx" 这种赋值 package main import "fmt" type Test struct { Name string } var list map[string]Test func main() { list = make(map[string]Test) name := Test
问题内容: 我有两个表,想要像这样在sqlite上比较行 我想产生这样的结果 sqlite中的语法如何?谢谢 问题答案:
我有两个表,分别是产品和采购: PRODUCTS表-将获得购买的所有新产品。这意味着表prroducts中不存在相同的productname。所有独特产品列表 采购表-具有唯一purchase_id的所有采购产品的列表。 > 如果要在PURCHASE中添加或插入值,表PRODUCTS将获得PURCHASE的所有值,但前提是PURCHASE中的productname不存在于PRODUCTS中的'pr
问题内容: 我需要在Java中比较两个日期。我正在使用这样的代码: 这是行不通的。变量的内容如下: 包含 包含 我该如何解决? 问题答案: 日期相等性取决于两个等于毫秒的日期。使用创建新的Date对象将永远不会等于过去创建的日期。Joda Time 的API简化了日期的处理。但是,仅使用Java的SDK: