2012-04-17 16 views
28

Diciamo che hoChiamare un metodo da un modello Go

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

Come posso usare questo metodo da un html/modello? Avrei bisogno di qualcosa del genere nel mio modello:

{{ .Label() }} 

risposta

33

Basta omettere le parentesi e dovrebbe andare bene. Esempio:

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

Secondo la documentation, si può chiamare qualsiasi metodo che restituisce un valore (di qualsiasi tipo) o due valori se il secondo è di tipo error. Nel caso successivo, Execute restituirà quell'errore se è diverso da zero e interromperà l'esecuzione del modello.

+3

Grazie, funziona! L'avevo provato, ma il destinatario del mio metodo era * Persona invece di Persona. Quindi non funziona con i ricevitori di puntatori, che sembra essere il bersaglio. – Blacksad

+3

Funziona anche con i ricevitori di puntatori. Ma si noti che quando si ha un 'func (p * Person) Label()' solo i valori del tipo '* Person' avranno un metodo Label(). Non puoi chiamare quel metodo su un 'Person', poiché non lo hai definito. – tux21b

+0

E posso scrivere {{&. }} per ottenere l'indirizzo di. nel mio modello? – Blacksad

17

È anche possibile passare parametri a funzionare come segue

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

E poi nel modello scrivere

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

Supponendo che la persona nel modello è una variabile di tipo Person passato a modello.

Problemi correlati