4

我正在尝试使用 Google App Engine 在 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)
    }

}

但我只得到一个Internal Server Error

当我使用时err = tmpl.Execute(w, name)(您可以在代码的注释中找到“名称”),没关系。

你知道可能是什么问题吗?我是golang的新手。

谢谢!

4

2 回答 2

4

其他人会以更简洁/准确的答案做出回应,但是您可以使上述示例正常工作的一种简单方法是将您的data声明更改为:

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

data在这里,您正在制作type 切片的每个元素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其设为大写,使其与属性名称匹配并包装tr{{range .}}块中,以便为每个条目创建一个新行(我假设这就是您要查找的内容 - 如果不是,请确保range包含任何动态内容你要)。

于 2012-11-25T21:12:16.287 回答
1

如果template.Parse返回错误,则不能使用它返回的其他值。如果模板执行失败,您将尝试调用tmpl.Executenil tmpl,这会导致恐慌。

于 2014-07-08T04:08:48.037 回答