How do I access substrings (s[:2]) in Go templates?
Similar to Go templates: How do I access array item (arr[2]) in templates?
How do I directly access substrings (e.g. s[:2]) in Go templates?
Whenever I do this I get "bad character U+005B '['"
{{ .s[:2] }}
Solution 1:
You may use the slice
template function on string
s too (it was added in Go 1.13):
Template functions:
slice slice returns the result of slicing its first argument by the remaining arguments. Thus "slice x 1 2" is, in Go syntax, x[1:2], while "slice x" is x[:], "slice x 1" is x[1:], and "slice x 1 2 3" is x[1:2:3]. The first argument must be a string, slice, or array.
For example:
t := template.Must(template.New("").Parse(`{{ slice . 0 2 }}`))
if err := t.Execute(os.Stdout, "abcdef"); err != nil {
panic(err)
}
This will output (try it on the Go Playground):
ab
Don't forget that Go strings store the UTF-8 encoded byte sequence, and indexing and slicing strings uses the byte index (not the rune
index). This matters when the string contains multi-byte runes, like in this example:
t := template.Must(template.New("").Parse(`{{ slice . 0 3 }}`))
if err := t.Execute(os.Stdout, "世界"); err != nil {
panic(err)
}
This will output a single rune
(try it on the Go Playground):
世