2012-04-17 13 views
28

Digamos que tengoLlamar a un método de una plantilla Ir

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

¿Cómo puedo utilizar este método desde un html/plantilla? Necesitaría algo como esto en mi plantilla:

{{ .Label() }} 

Respuesta

33

Simplemente omita los paréntesis y debería estar bien. Ejemplo:

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

Según la documentation, puede llamar a cualquier método que devuelve un valor (de cualquier tipo) o dos valores si la segunda es de tipo error. En el caso posterior, Execute devolverá ese error si no es nulo y detendrá la ejecución de la plantilla.

+3

¡Gracias, funciona! Lo había intentado, pero el receptor de mi método era * Persona en vez de Persona. Por lo tanto, no funciona con los receptores de puntero, parece ser la trampa. – Blacksad

+3

También funciona con receptores de puntero. Pero tenga en cuenta que cuando tiene un 'func (p * Person) Label()' solo los valores del tipo '* Person' tendrán un método Label(). No puede llamar a ese método en una 'Persona', ya que no lo ha definido. – tux21b

+0

Y puedo escribir {{&. }} para obtener la dirección de. en mi plantilla? – Blacksad

17

Incluso puede pasar parámetros a una función como la siguiente

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

Y luego, en la plantilla de escribir

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

Suponiendo que la persona de la plantilla es una variable de tipo Persona pasado a la plantilla.

Cuestiones relacionadas