【发布时间】:2018-12-09 14:20:18
【问题描述】:
我正在尝试将包含多个结构切片的结构传递到模板中。有没有办法重构模板,以便我可以只使用一个循环来显示所有数据(以避免复制和粘贴我拥有的每个 Stock 结构)。我尝试传入一个二维数组,但无法访问我需要的元素,也无法自己将模板重构为只有一个使用循环。
以下代码是我正在使用的代码的简化版本。
package main
import (
"fmt"
"html/template"
"os"
)
type Stock struct {
BuyPrice string
SellPrice string
}
type StockPortfolio struct {
StockA []Stock
StockB []Stock
}
func main() {
// Stocks aren't combined from the get-go because I have more
// struct fields relating to each individial trading pair
stockAUSD := Stock{
BuyPrice: "1.00 USD",
SellPrice: "1.10 USD",
}
stockAEURO := Stock{
BuyPrice: "0.85 EUR",
SellPrice: "0.94 EUR",
}
stockBUSD := Stock{
BuyPrice: "2.00 USD",
SellPrice: "2.10 USD",
}
stockBEURO := Stock{
BuyPrice: "1.70 EUR",
SellPrice: "1.88 EUR",
}
stockA := []Stock{stockAUSD, stockAEURO}
stockB := []Stock{stockBUSD, stockBEURO}
portfolio := StockPortfolio{stockA, stockB}
tmpl := `
<table>
<tr>
<td>Price A</td>
{{range .StockA}}
<td>{{ .BuyPrice }}</td>
<td>{{ .SellPrice }}</td>
{{end}}
</tr>
<tr>
<td>Price B</td>
{{range .StockB}}
<td>{{ .BuyPrice }}</td>
<td>{{ .SellPrice }}</td>
{{end}}
</tr>
</table>
`
t := template.Must(template.New("tmpl").Parse(tmpl))
err := t.Execute(os.Stdout, portfolio)
if err != nil {
fmt.Println("executing template:", err)
}
}
【问题讨论】:
-
您可以尝试使用 2d 地图。由于有两个数组,您仍然需要 2 个循环,但您不需要更改模板或复制和粘贴任何内容。在模板中,您可以编写 {{ range $key, $value := 。 }} 然后迭代每个键的值。
标签: go go-templates