Другой вариант заключается в использовании действие {{with}}
вместо функции шаблона and
.
Цитирование из пакета РОУ text/template
:
{{with pipeline}} T1 {{end}}
If the value of the pipeline is empty, no output is generated;
otherwise, dot is set to the value of the pipeline and T1 is
executed.
Использование {{with}}
часто приводит к более чистой и более короткий код, так как внутри {{with}}
точка .
уже установлен в непустой «обертке» , .User
в нашем случае; кроме того, вам не нужно беспокоиться о том, как и если оцениваются аргументы функции шаблона and
.
Шаблон переписан:
{{with .User -}}
{{if .Registered}}REGISTERED{{end}}
{{- end}}
Тестирование без и с пользователем:
t := template.Must(template.New("").Parse(tmpl))
fmt.Println("No user:")
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}
u := struct{ Registered bool }{true}
fmt.Printf("User: %+v\n", u)
if err := t.Execute(os.Stdout, map[string]interface{}{"User": u}); err != nil {
panic(err)
}
Output (попробуйте его на Go Playground):
No user:
User: {Registered:true}
REGISTERED
Я пытаюсь escape, используя вложенный ifs .. потому что он будет дублировать слишком много кода шаблона между – Goranek
, хотя это это не настоящее решение, я собираюсь принять его. – Goranek