Начиная со структуры, содержащей фрагменты нескольких структур в шаблоне - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь передать структуру, содержащую несколько фрагментов структур, в шаблон. Есть ли способ реорганизовать шаблон, чтобы я мог отображать все данные, используя только один цикл (чтобы избежать копирования и вставки для каждой отдельной структуры Stock, которая у меня есть). Я попытался передать массив 2d и не смог получить доступ к нужным мне элементам, и мне не удалось самостоятельно выполнить рефакторинг шаблона только для одного цикла использования.

Следующий код является упрощенной версией того, с чем я работаю.

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 голосов
/ 04 июля 2018

Этот шаблон должен делать то, что вы хотите; range s над первым и вторым срезами и распечатайте всю информацию о запасе:

<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 с.

...