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