【问题标题】:Ranging over a struct containing slices of multiple structs in a template遍历包含模板中多个结构切片的结构
【发布时间】: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


【解决方案1】:

这个模板应该是你想要的;它ranges 在你的第一个和第二个切片上并打印所有股票信息:

<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 现在是Stocks 的切片:

// 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

....

这应该会为您提供一个格式良好的表格,而无需手动循环遍历所有 Stocks。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-02
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多