2012-04-17 21 views
28

से एक विधि मान लीजिए कि मैंएक जाओ टेम्पलेट

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

है कैसे मैं एक html/टेम्पलेट से इस पद्धति का उपयोग कर सकते हैं कॉल? मुझे अपने टेम्पलेट में ऐसा कुछ चाहिए:

{{ .Label() }} 

उत्तर

33

बस कोष्ठक छोड़ दें और यह ठीक होना चाहिए। उदाहरण:

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

documentation के अनुसार, आप किसी भी विधि है जो (किसी भी प्रकार की) एक मूल्य या दो मानों वापस लौट आता है दूसरा एक प्रकार error की है कॉल कर सकते हैं। बाद के मामले में, Execute उस त्रुटि को वापस कर देगा यदि यह गैर-शून्य है और टेम्पलेट के निष्पादन को रोकें।

+3

धन्यवाद, यह काम करता है! मैंने कोशिश की थी, लेकिन मेरी विधि का रिसीवर * व्यक्ति के बजाय व्यक्ति था। तो यह पॉइंटर रिसीवर के साथ काम नहीं करता है, जो कैच लगता है। – Blacksad

+3

यह पॉइंटर रिसीवर के साथ भी काम करता है। लेकिन कृपया ध्यान दें कि जब आपके पास 'func (p * व्यक्ति) लेबल() 'प्रकार है, तो' * व्यक्ति 'के केवल मानों में लेबल() विधि होगी। आप उस विधि को 'व्यक्ति' पर कॉल नहीं कर सकते, क्योंकि आपने इसे परिभाषित नहीं किया है। – tux21b

+0

और क्या मैं {{&। }} का पता पाने के लिए। मेरे टेम्पलेट में? – Blacksad

17

तुम भी कार्य करने के लिए पैरामीटर भेजने की तरह

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

इस प्रकार है और फिर टेम्पलेट में यह मानते हुए कि टेम्पलेट में व्यक्ति प्रकार व्यक्ति खाका के लिए पारित की एक चर रहा है

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

लिख सकते हैं।

संबंधित मुद्दे