我有这个结构:
const (
paragraph_hypothesis = 1<<iota
paragraph_attachment = 1<<iota
paragraph_menu = 1<<iota
)
type Paragraph struct {
Type int // paragraph_hypothesis or paragraph_attachment or paragraph_menu
}
我希望以Type
依赖的方式显示我的段落。
我找到的唯一解决方案是基于专用函数,例如isAttachment
测试Go中的Type
和嵌套{{if}}
:
{{range .Paragraphs}}
{{if .IsAttachment}}
-- attachement presentation code --
{{else}}{{if .IsMenu}}
-- menu --
{{else}}
-- default code --
{{end}}{{end}}
{{end}}
事实上,我有更多类型,这使得它更奇怪,使用IsSomething
函数的Go代码和带有{{end}}
的模板混乱。
什么是清洁解决方案? go模板中是否有一些switch
或if/elseif/else
解决方案?或者采用完全不同的方式处理这些案件?
答案 0 :(得分:28)
模板是无逻辑的。他们不应该有这种逻辑。你可以拥有的最大逻辑是一堆if
。
在这种情况下,你应该这样做:
{{if .IsAttachment}}
-- attachment presentation code --
{{end}}
{{if .IsMenu}}
-- menu --
{{end}}
{{if .IsDefault}}
-- default code --
{{end}}
答案 1 :(得分:8)
是的,您可以使用{{else if .IsMenu}}
答案 2 :(得分:6)
您可以通过向template.FuncMap添加自定义功能来实现switch
功能。
在下面的示例中,我定义了一个函数printPara (paratype int) string
,它接受一个已定义的段落类型并相应地更改它的输出。
请注意,在实际模板中,.Paratype
通过管道传输到printpara
功能。这是如何在模板中传递参数。请注意,添加到FuncMap
的函数的输出参数的数量和形式有限制。 This page有一些很好的信息,以及第一个链接。
package main
import (
"fmt"
"os"
"html/template"
)
func main() {
const (
paragraph_hypothesis = 1 << iota
paragraph_attachment = 1 << iota
paragraph_menu = 1 << iota
)
const text = "{{.Paratype | printpara}}\n" // A simple test template
type Paragraph struct {
Paratype int
}
var paralist = []*Paragraph{
&Paragraph{paragraph_hypothesis},
&Paragraph{paragraph_attachment},
&Paragraph{paragraph_menu},
}
t := template.New("testparagraphs")
printPara := func(paratype int) string {
text := ""
switch paratype {
case paragraph_hypothesis:
text = "This is a hypothesis\n"
case paragraph_attachment:
text = "This is an attachment\n"
case paragraph_menu:
text = "Menu\n1:\n2:\n3:\n\nPick any option:\n"
}
return text
}
template.Must(t.Funcs(template.FuncMap{"printpara": printPara}).Parse(text))
for _, p := range paralist {
err := t.Execute(os.Stdout, p)
if err != nil {
fmt.Println("executing template:", err)
}
}
}
产地:
这是一个假设
这是附件
菜单
1:
2:
3:选择任何选项:
希望有帮助,我很确定代码可以清理一下,但我试图接近您提供的示例代码。