我正在尝试将包含多个结构片的结构传递到模板中。有没有一种方法可以重构模板,以便仅使用一个循环就可以显示所有数据(以避免对我拥有的每个Stock结构进行复制和粘贴)。我尝试传递2D数组,但无法访问所需的元素,也无法自己将模板重构为仅一个use循环。
以下代码是我正在使用的代码的简化版本。
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)
}
}
答案 0 :(得分:0)
该模板应该确实要您想要; range
在您的第一片和第二片上,并打印所有库存信息:
<html>
<body>
<h1>All Stocks</h1>
<table>
{{ range $key, $val := . }}
<tr>
<td>Portfolio Number: {{ $key }}</td>
</tr>
<tr>
<td>Buy Price</td>
<td>Sell Price</td>
</tr>
{{ range $val2 := . }}
<tr>
<td>{{ $val2.BuyPrice }}</td>
<td>{{ $val2.SellPrice }}</td>
</tr>
{{ end }}
{{ end }}
</table>
</body>
</html>
但是此解决方案需要一些重组。也就是说,Portfolio
现在是Stock
s的一部分:
// Portfolio is a slice of slices of stocks
type Portfolio [][]Stock
....
stockA := []Stock{stockAUSD, stockAEURO}
stockB := []Stock{stockBUSD, stockBEURO}
portfolio := Portfolio([][]Stock{stockA, stockB}) // for illustrative purposes
....
这应该为您提供格式良好的表格,而无需手动遍历所有Stock
。