golang text/template starts with function

WBOY
Release: 2024-02-06 11:15:03
forward
595 people have browsed it

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"}}
Copy after login


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}}
`
Copy after login

This will output (try it on go playground):

foo: no
begining: yes
Copy after login

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}}
Copy after login

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}}
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template