2012-04-17 29 views
28

Hãy nói rằng tôi cóGọi một phương pháp từ một Go mẫu

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

Làm thế nào tôi có thể sử dụng phương pháp này từ một html/mẫu? Tôi sẽ cần một cái gì đó như thế này trong mẫu của tôi:

{{ .Label() }} 

Trả lời

33

Chỉ cần bỏ qua dấu ngoặc đơn và nó sẽ ổn. Ví dụ:

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

Theo documentation, bạn có thể gọi bất kỳ phương pháp mà trả về một giá trị (của bất kỳ loại) hoặc hai giá trị nếu điều thứ hai là loại error. Trong trường hợp sau, Execute sẽ trả về lỗi đó nếu nó không phải là số không và ngừng thực thi mẫu.

+3

Cảm ơn, nó hoạt động! Tôi đã thử nó, nhưng người nhận phương pháp của tôi là * Người thay vì Người. Vì vậy, nó không làm việc với máy thu con trỏ, mà có vẻ là bắt. – Blacksad

+3

Nó cũng hoạt động với bộ thu con trỏ. Nhưng xin lưu ý rằng khi bạn có một 'func (p * Person) Label()' chỉ các giá trị của kiểu '* Person' sẽ có một phương thức Label(). Bạn không thể gọi phương thức đó trên một 'Person', vì bạn chưa định nghĩa nó. – tux21b

+0

Và tôi có thể viết {{&. }} để lấy địa chỉ. trong mẫu của tôi? – Blacksad

17

Bạn thậm chí có thể vượt qua các thông số hoạt động như sau

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

Và sau đó trong mẫu viết

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

Giả sử rằng người trong mẫu là một biến kiểu Person truyền cho Mẫu.

Các vấn đề liên quan