Golang:遍历切片并生成HTML表格

huangapple go评论96阅读模式
英文:

Golang: range through slice and generate HTML table

问题

我有一个字符串切片,我想遍历该切片并使用其中的值创建一个简单的HTML表格。以下是一些示例代码:

var tmpl = `<td>%s</td>`
names := []string{"john", "jim"}
for _, v := range names {
    fmt.Printf(tmpl, v)
}

这将产生:

<!-- begin snippet: js hide: false -->

<!-- language: lang-html -->
<td>john</td><td>jim</td>

<!-- end snippet -->

我想将返回的结果用于创建一个HTML表格,或者至少能够将其传递给另一个具有表格结构的HTML模板。有什么想法如何实现这个目标?

英文:

I have a string slice, I'd like to range through the slice and create a simple HTML table with the values. This is some sample code to illustrate:

var tmpl = `&lt;td&gt;%s&lt;/td&gt;`
names := []string{&quot;john&quot;, &quot;jim&quot;}
	for _, v := range names {
      fmt.Printf(tmpl, v)
    }

This produces:

<!-- begin snippet: js hide: false -->

<!-- language: lang-html -->

&lt;td&gt;john&lt;/td&gt;&lt;td&gt;jim&lt;/td&gt;

<!-- end snippet -->

I'd like to take what's returned and create a HTML table or at least be able to pass it to another HTML template that has the table structure. Any ideas how this can be done?

答案1

得分: 8

以下是创建表格的一种方法:

var tmpl = `<tr><td>%s</td></tr>`
fmt.Printf("<table>")
names := []string{"john", "jim"}
for _, v := range names {
      fmt.Printf(tmpl, v)
}
fmt.Printf("</table>")

你也可以使用 html/template 包:

t := template.Must(template.New("").Parse(`<table>{{range .}}<tr><td>{{.}}</td></tr>{{end}}</table>`))
names := []string{"john", "jim"}
if err := t.Execute(os.Stdout, names); err != nil {
  log.Fatal(err)
}

我没有足够的能量来回答上面 OP 评论中的问题,所以我会在这里回答。

模板接受一个单一的参数。如果你想要向模板传递多个值,那么创建一个结构体来保存这些值:

var data struct{ 
    A int
    Names []string
}{
    1,
    []string{"john", "jim"},
}
if err := t.Execute(os.Stdout, &data); err != nil {
   log.Fatal(err)
}

在模板中使用 {{.A}} 和 {{.Name}}。

英文:

Here's one way to create a table:

var tmpl = `&lt;tr&gt;&lt;td&gt;%s&lt;/td&gt;&lt;/tr&gt;`
fmt.Printf(&quot;&lt;table&gt;&quot;)
names := []string{&quot;john&quot;, &quot;jim&quot;}
for _, v := range names {
      fmt.Printf(tmpl, v)
}
fmt.Printf(&quot;&lt;/table&gt;&quot;)

You can also use the html/template package:

t := template.Must(template.New(&quot;&quot;).Parse(`&lt;table&gt;{{range .}}&lt;tr&gt;&lt;td&gt;{{.}}&lt;/td&gt;&lt;/tr&gt;{{end}}&lt;/table&gt;`))
names := []string{&quot;john&quot;, &quot;jim&quot;}
if err := t.Execute(os.Stdout, names); err != nil {
  log.Fatal(err)
}

I do not have enough juice to answer the question in OP's comment above, so I'll answer it here.

A template takes a single argument. If you want to pass multiple values to a template, then create a struct to hold the values:

 var data struct{ 
    A int
    Names []string
 }{
    1,
    []string{&quot;john&quot;, &quot;jim&quot;},
 }
 if err := t.Execute(os.Stdout, &amp;data); err != nil {
   log.Fatal(err)
 }

Use {{.A}} and {{.Name}} in the template.

huangapple
  • 本文由 发表于 2015年4月6日 03:34:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/29461379.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定