遍历包含模板中多个结构的切片的结构

时间:2018-06-30 19:09:00

标签: go go-templates

我正在尝试将包含多个结构片的结​​构传递到模板中。有没有一种方法可以重构模板,以便仅使用一个循环就可以显示所有数据(以避免对我拥有的每个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)
    }
}

1 个答案:

答案 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