Лучшим решением для комплексных решений, приведенных выше, является прекращение попыток использовать параметр конфигурации верхнего уровня, а вместо этого записать его в качестве функции шаблона с переменной config, находящейся в закрытии функции
{{- define "person"}}
{{if SwitchNameOrder}}
Person name is: {{.SecondName}} {{.FirstName}}
{{else}}
Person name is: {{.FirstName}} {{.SecondName}}
{{end}}
{{end}}
и
t := template.Must(template.New("document").Funcs(template.FuncMap{
"SwitchNameOrder": func() bool {
return switchNames // variable sits in closure
},
}).Parse(document))
https://play.golang.org/p/O6QHtmxweOi
Другой вариант - записать все переключение в виде строковой функции, а именно:
{{- define "person"}}
Person name is: {{SwitchNames .FirstName .SecondName}}
{{end}}
и SwitchNames
как строковая функция
...Funcs(template.FuncMap{
"SwitchNames": func(first, second string) string {
if switchNames {
return second + " " + first
}
return first + " " + second
},
})...
, которая может быть менее или более чистой, в зависимости от фактической сложности
https://play.golang.org/p/UPB3NIpzw0N