С пользовательской функцией
В шаблонах нет предварительно объявленной функции IsString()
, но мы можем легко зарегистрировать и использовать такую функцию:
t := template.Must(template.New("").Funcs(template.FuncMap{
"IsString": func(i interface{}) bool {
_, ok := i.(string)
return ok
},
}).Parse(`{{.}} {{if IsString .}}is a string{{else}}is not a string{{end}}`))
fmt.Println(t.Execute(os.Stdout, "hi"))
fmt.Println(t.Execute(os.Stdout, 23))
Это выведет (попробуйтеэто на Go Playground ):
hi is a string<nil>
23 is not a string<nil>
(Литералы <nil>
в конце строк - это значения ошибок, возвращаемые выполнением шаблона, что говорит об отсутствии ошибок.)
Использование printf
и %T
глагол
Мы также можем сделать это без пользовательских функций.По умолчанию доступна функция printf
, которая является псевдонимом для fmt.Sprintf()
.И есть глагол %T
, который выводит тип аргумента.
Идея состоит в том, чтобы вызвать printf %T
для значения и сравнить результат с "string"
, и все готово:
t := template.Must(template.New("").
Parse(`{{.}} {{if eq "string" (printf "%T" .)}}is a string{{else}}is not a string{{end}}`))
fmt.Println(t.Execute(os.Stdout, "hi"))
fmt.Println(t.Execute(os.Stdout, 23))
Это также выведет (попробуйте на Go Playground ):
hi is a string<nil>
23 is not a string<nil>