如何测试值是否是模板中的字符串

时间:2019-05-11 14:33:11

标签: string go types go-templates

我想找出是否有可能,以及如何确定在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 个答案:

答案 0 :(得分:3)

具有自定义功能

模板中没有预先声明的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>