2013-03-12 6 views
7

एक वेब अनुप्रयोग में प्रत्येक अनुरोध के साथ निपटने के लिए, टेम्पलेट के बारे में सामान्य कोड इस तरह है:क्या गो में पुनः उपयोग करने के लिए टेम्पलेट्स को मानचित्र में रखना आवश्यक है?

t:= template.New("welcome") 
t, _ = t.ParseFiles("welcome.tpl") 
t.Execute(w, data) 

मुझे लगता है कि ParseFiles हर बार एक बहुत खर्च। क्या टेम्पलेट का पुन: उपयोग करना संभव है? तो मैं इसे इस तरह से सुधार:

//templateMap := make(map[string][template]) 
//... 
tplName :="welcome" 
t := templateMap[tplName] 
if t=nil{ 
    t:= template.New(tplName) 
    t, _ = t.ParseFiles("welcome.tpl") 
    templateMap[tplName] = t 
} 

t.Execute(w, data) 

मुझे आश्चर्य है कि यह एक नक्शा या एक कैश में टेम्पलेट्स डालकर दक्षता में सुधार करने से व्यवहार्य या साध्य है? मुझे यह भी आश्चर्य है कि Execute फ़ंक्शन सुरक्षित है या नहीं?

func (t *Template) Execute(wr io.Writer, data interface{}) (err error)

उत्तर

12

एक टेम्पलेट वास्तव में अपने आप में टेम्पलेट्स का एक नक्शा के रूप में कार्य कर सकते हैं। यहाँ मैं क्या करना है:

var t = template.New("master") 

मैं वास्तव में, "मास्टर" टेम्पलेट का उपयोग नहीं करते अन्य टेम्पलेट्स के लिए एक कंटेनर के रूप में छोड़कर:

मैं एक वैश्विक टेम्पलेट चर घोषणा करते हैं।

फिर, मैं सभी टेम्पलेट्स जब मेरे एप्लिकेशन शुरू होता लोड:

func init() { 
    _, err := t.ParseGlob("templates/*.html") 
    if err != nil { 
     log.Fatalln("Error loading templates:", err) 
    } 
} 

फिर जब मैं टेम्पलेट्स में से एक का उपयोग करना चाहते हैं, मैं नाम से पूछते हैं: मुमकिन है

t.ExecuteTemplate(w, "user.html", data) 
+0

क्या यह दृष्टिकोण टेम्पलेट्स के साथ काम करने का एक सुविधाजनक तरीका है जो विरासत का उपयोग करता है? (उदा।, जहां कुछ टेम्पलेट्स के लिए आधार टेम्पलेट है?) – carbocation

0

template.go के स्रोत कोड से, निष्पादित समारोह एक लॉक का उपयोग, मैं एक नौसिखिया हूँ, यह धागा सुरक्षित है लगता है, लेकिन नहीं दक्षता यदि कोई नक्शा करने के लिए टेम्पलेट उदाहरण डाल सकता है और यह पुन: उपयोग करने, अगर आप समवर्ती अनुरोधों की बहुत सारी की सेवा करने की जरूरत है कोशिश:

func (t *Template) Execute(wr io.Writer, data interface{}) (err error) { 
     t.nameSpace.mu.Lock() 
     if !t.escaped { 
       if err = escapeTemplates(t, t.Name()); err != nil { 
         t.escaped = true 
       } 
     } 
     t.nameSpace.mu.Unlock() 
     if err != nil { 
       return 
     } 
     return t.text.Execute(wr, data) 
} 
+0

महंगा भाग अंत में निष्पादन कॉल है। महत्वपूर्ण अनुभाग टेम्पलेट के लिए एक-ऑफ प्रारंभिकरण कर रहा है, इसलिए ध्यान देने योग्य नहीं होना चाहिए। –

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