2012-11-25 52 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如果模板执行失败,这将导致恐慌。