2013-03-12 14 views
7

Để đối phó với mọi yêu cầu trong một ứng dụng web, mã bình thường về mẫu là như thế này:Có cần phải đặt mẫu vào bản đồ để sử dụng lại trong Go không?

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

Tôi đoán ParseFiles mỗi khi chi phí rất nhiều. Có thể sử dụng lại mẫu không? Vì vậy, tôi đã cải thiện nó như sau:

//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) 

Tôi tự hỏi có khả thi hay có thể cải thiện hiệu quả bằng cách đặt mẫu vào bản đồ hoặc bộ nhớ cache? Tôi cũng tự hỏi chức năng Execute có phải là chủ đề an toàn hay không?

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

Trả lời

12

Mẫu thực sự có thể hoạt động như một bản đồ các mẫu. Dưới đây là những gì tôi làm:

Tôi tuyên bố một mẫu biến toàn cầu:

var t = template.New("master") 

Tôi không thực sự sử dụng "bậc thầy" mẫu, trừ khi một container cho các mẫu khác.

Sau đó, tôi tải tất cả các mẫu khi ứng dụng của tôi bắt đầu:

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

Sau đó, khi tôi muốn sử dụng một trong những mẫu, tôi yêu cầu nó theo tên:

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

Có cách nào thuận tiện để làm cho phương pháp này hoạt động với các mẫu sử dụng thừa kế không? (Ví dụ: nơi có mẫu cơ sở cho một số mẫu?) – carbocation

0

Từ mã nguồn của template.go, Execute chức năng sử dụng một Lock, Tôi là một newbie, hình ảnh chính là chủ đề an toàn, nhưng có thể không hiệu quả nếu đặt mẫu để dụ một bản đồ và cố gắng sử dụng lại, nếu bạn cần phân phát nhiều yêu cầu đồng thời:

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

lẽ đắt một phần là cuộc gọi Execute ở cuối. Phần quan trọng là thực hiện khởi tạo một lần cho mẫu, vì vậy không đáng chú ý. –

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