2012-04-17 13 views
28

Powiedzmy mamWywołuje metodę z szablonu Go

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

Jak mogę skorzystać z tej metody z html/szablonu? Potrzebuję czegoś takiego w moim szablonie:

{{ .Label() }} 

Odpowiedz

33

Po prostu pomiń nawiasy i powinno być dobrze. Przykład:

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

Według documentation można wywołać żadnego sposobu, który zwraca jedną wartość (dowolnego typu) lub dwu wartości, gdy druga jest typu error. W późniejszym przypadku Execute zwróci ten błąd, jeśli nie będzie zerowy i zatrzyma wykonywanie szablonu.

+3

Dzięki, to działa! Próbowałem, ale odbiorcą mojej metody była * Osoba zamiast Osoby. Więc nie działa z odbiornikami wskaźnikowymi, które wydają się być haczykiem. – Blacksad

+3

Działa również z odbiornikami wskaźnika. Należy jednak pamiętać, że jeśli masz etykietę 'func (p * Person)()' tylko wartości typu '* Person' będą miały metodę Label(). Nie możesz wywołać tej metody na "Osobie", ponieważ jej nie zdefiniowałeś. – tux21b

+0

Czy mogę napisać {{&. }}, aby uzyskać adres. w moim szablonie? – Blacksad

17

Można nawet przekazać parametry do funkcji takich jak następuje

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

I wtedy w szablonie napisać

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

Zakładając, że osoba w szablonie jest zmienną typu osoby przeszły do ​​szablonu.