Как проверить, является ли значение строкой в ​​шаблоне - PullRequest
2 голосов
/ 11 мая 2019

Я хотел бы выяснить, возможно ли это, и если да, то как проверить, является ли значение строкой в ​​шаблоне Go.

Я попробовал следующее безуспешно

{{- range .Table.PrimaryKeys.DBNames.Sorted }}{{ with (index $colsByName .)}}
{{ .Name }}: {{ if .IsArray }}[]{{ end }}'{{.Type}}', {{end}}
{{- end }}
{{- range $nonPKDBNames }}{{ with (index $colsByName .) }}
    {{ .Name }}: {{ if .IsArray }}[]{{end -}} {
  type: {{ if .Type IsString}}GraphQLString{{end -}}, # line of interest where Type is a value that could be a number, string or an array
}, {{end}}
{{- end }}

И это ошибка, которую я получаю

Ошибка: ошибка синтаксического анализа TablePaths: ошибка синтаксического анализа содержимого шаблона: template: templates / table.gotmpl: 42: функция "IsString" не определена

1 Ответ

3 голосов
/ 11 мая 2019

С пользовательской функцией

В шаблонах нет предварительно объявленной функции 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>
...