Home >Backend Development >Golang >golang text/template starts with function

golang text/template starts with function

WBOY
WBOYforward
2024-02-06 11:15:03614browse

golang 文本/模板以函数开头

Question content

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"}}

Correct answer


There is no built-in startswithtemplate 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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete