2012-11-25 91 views
3

我試圖使GO與谷歌App Engine的一個網頁,其中可以顯示與HTML解析數組的內容。如何GO解析HTML模板,谷歌應用程序引擎

package hello 

import (
    "fmt" 
    "html/template" 
    "net/http" 
) 

func init() { 
    http.HandleFunc("/", root) 
} 

const TemplateHTML = ` 
<html> 
    <body> 
    <table width="700" border="1" align="center"> 
    <tr> 
    <td> 
    {{range}} {{.name}} {{end}} {{range}} {{.Count}} {{end}} 
</td> 
    </tr> 
</table> 

    </body> 
</html> 
` 

func root(w http.ResponseWriter, r *http.Request) { 
    type variables struct { 
     Name string 
     Count int 
    } 
    var data = []variables{ 
     {"John", 25}, 
     {"George", 35}, 
     {"NoName", 27}, 
    } 

    //name := variables{"Somebody", 25} 
    tmpl, err := template.New("i").Parse(TemplateHTML) 

    if err != nil { 
     fmt.Fprint(w, err) 
    } 
    err = tmpl.Execute(w, data) 
    if err != nil { 
     fmt.Fprint(w, err) 
    } 

} 

但我只得到一個內部服務器錯誤

當我使用err = tmpl.Execute(w, name)(你可以在代碼的註釋中找到'name'),那沒問題。

你有什麼想法是什麼問題?我是golang的新手。

謝謝!

回答

3

別人會用更簡潔/準確的答案迴應,但一個簡單的方法就可以讓你上面的例子中的工作是你的data聲明更改爲:

var data = []variables{ 
    variables{"John", 25}, 
    variables{"George", 35}, 
    variables{"NoName", 27}, 
} 

在這裏,你正在各data類型的片段variables,它將與定義中的variables類型相匹配。我相信這是您當前版本的主要問題 - 正確的數據類型未提供給data。然後,你就只需要調整您的模板,使您的字符串如下所示:

const TemplateHTML = ` 
<html> 
    <body> 
    <table width="700" border="1" align="center"> 
    {{range .}} 
    <tr> 
     <td>{{.Name}}</td><td>{{.Count}}</td> 
    </tr> 
    {{end}} 
    </tr> 
</table> 

    </body> 
</html> 
` 

這裏的關鍵變化:使.Name大寫所以它的屬性名相匹配,並且在{{range .}}塊包裝tr從而使新行每個條目創建(我假定這就是你要找的人 - 如果不是,只是確保range包括任何你想要的動態內容)。

+0

謝謝你的答案。現在它運作良好。 :) – valaki

+0

@valaki當然,高興地幫忙! – RocketDonkey

+0

這是不對的。不需要在'[]變量'的片段文字中說'變量'。該更改對編譯的代碼沒有影響。 – dsymonds

1

如果template.Parse返回一個錯誤,你不能用它返回另一個值。你試圖調用tmpl.Execute在零tmpl如果模板執行失敗,這將導致恐慌。