Call a method from a Go template

GoGo Templates

Go Problem Overview


Let's say I have

type Person struct {
  Name string
}
func (p *Person) Label() string {
  return "This is " + p.Name
}

How can I use this method from a html/template ? I would need something like this in my template:

{{ .Label() }}

Go Solutions


Solution 1 - Go

Just omit the parentheses and it should be fine. Example:

package main

import (
	"html/template"
	"log"
	"os"
)

type Person string

func (p Person) Label() string {
	return "This is " + string(p)
}

func main() {
	tmpl, err := template.New("").Parse(`{{.Label}}`)
	if err != nil {
		log.Fatalf("Parse: %v", err)
	}
	tmpl.Execute(os.Stdout, Person("Bob"))
}

According to the documentation, you can call any method which returns one value (of any type) or two values if the second one is of type error. In the later case, Execute will return that error if it is non-nil and stop the execution of the template.

Solution 2 - Go

You can even pass parameters to function like follows

type Person struct {
  Name string
}
func (p *Person) Label(param1 string) string {
  return "This is " + p.Name + " - " + param1
}

And then in the template write

{{with person}}
    {{ .Label "value1"}}
{{end}}

Assuming that the person in the template is a variable of type Person passed to Template.

Solution 3 - Go

Unsure if it is incompetence on my part or a recent change in Go templates, but I am unable to access functions on the data struct passed into Execute. Always receive "can't evaluate field" error.

I was able to get this working by using FuncMap instead.

Example:

temp := template.New("templatename.gohtml")
temp.Funcs(
	template.FuncMap{
		"label": Label,
	},
)
temp, err := temp.ParseFiles(
	"templatename.gohtml",
)
if err != nil {
	log.Fatal("Error parsing template", err)
}

err = temp.Execute(os.Stdout, nil)

In template:

{{label "the label"}}

Label func:

func Label(param string) string {
  ...
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBlacksadView Question on Stackoverflow
Solution 1 - Gotux21bView Answer on Stackoverflow
Solution 2 - GoUsman QadriView Answer on Stackoverflow
Solution 3 - GoSam BerryView Answer on Stackoverflow