I don’t see any type of startswith
in the go text/template
package function. Is this the best implementation?
{{if eq (slice $c 0 5) "begin"}}
There is no built-in startswith
template function.
The cleanest is if you register a custom function with that functionality:
func main() { t := template.must(template.new("").funcs(template.funcmap{ "hasprefix": strings.hasprefix, }).parse(src)) for _, s := range []string{"foo", "begining"} { if err := t.execute(os.stdout, s); err != nil { panic(err) } } } const src = `{{.}}: {{if hasprefix . "begin"}}yes{{else}}no{{end}} `
This will output (try it on go playground):
foo: no begining: yes
If you can't or don't want to register a custom function, slice
works with strings, but you have to be careful with it: if the input string is shorter than 5 bytes, you will get a template execution error !
Instead (if you don't want to register a custom function), I recommend using the built-in printf
function, where the precision is the length of the strings being compared. printf
does not panic if the input string is shorter:
{{if eq (printf "%.5s" .) "begin"}}yes{{else}}no{{end}}
This output is the same. Try this on go playground.
Note that using hasprefix
is safer, cleaner, and simpler because we don't have to hardcode the length of the prefix (5
).
Note that using explicit parameter indexing we can also make this part dynamic:
{{$prefix := "begin"}}{{if eq (printf "%.[1]*s" (len $prefix) .) $prefix}}yes{{else}}no{{end}}
As you can see, we can get rid of the hardcoded length of the prefix 5
. This again outputs the same content, please try it on go playground.
One last thing to note: the slice string interprets the index as byte index, while the precision used in the format string is interpreted as rune count!
The above is the detailed content of golang text/template starts with function. For more information, please follow other related articles on the PHP Chinese website!