Шаблон Go не работает правильно с if и range - PullRequest
0 голосов
/ 06 октября 2019

https://play.golang.org/p/iQConmYgIN0

PortfolioTemplate неправильно обрабатывает if. Это if тормозит наружу Range. Как это исправить?

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Замена 0 на 0.0 в сравнении помогла.

1 голос
/ 06 октября 2019

Использование функции шаблона может быть лучшим способом сделать это.

В следующем примере кода я определил функцию font, которая будет определять цвет из типа Yield (который я извлек)и переместился наверх для этого примера).

Пример кода:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "html/template"
)

type Yield struct {
    Currency string  `json:"currency"`
    Value    float64 `json:"value"`
}

const portfolioJson = `{
    "payload": {
        "positions": [
            {
                "balance": 300,
                "expectedYield": {
                    "currency": "RUB",
                    "value": 1314
                },
                "ticker": "SBERP"
            },
            {
                "balance": 4,
                "expectedYield": {
                    "currency": "USD",
                    "value": -14.87
                },
                "ticker": "MA"
            }
        ]
    }
}`

const PortfolioTemplate = `
<ol>
    {{range .Payload.Positions}}
        <li>
            <strong>{{.Ticker}}</strong> {{.Balance}} ( 

                <font color="{{.ExpectedYield | font }}">

                {{.ExpectedYield.Value}}</font> {{.ExpectedYield.Currency}}
            )   
        </li>
    {{end}}
</ol>
`

type Portfolio struct {
    Payload struct {
        Positions []struct {
            Ticker        string  `json:"ticker"`
            Balance       float64 `json:"balance"`
            ExpectedYield Yield   `json:"expectedYield"`
        }
    } `json:"payload"`
}

func (portfolio *Portfolio) Prettify() string {
    fontColor := func(y Yield) string {
        if y.Value > 0 {
            return "green"
        }

        return "red"
    }

    t := template.New("Portfolio")

    buff := bytes.Buffer{}
    tpl := template.Must(t.Funcs(template.FuncMap{"font": fontColor}).Parse(PortfolioTemplate))
    _ = tpl.Execute(&buff, portfolio)
    return buff.String()
}

func main() {
    var portfolio Portfolio
    _ = json.Unmarshal([]byte(portfolioJson), &portfolio)
    fmt.Println(portfolio.Prettify())
}

Вывод:

<ol>

        <li>
            <strong>SBERP</strong> 300 (

                <font color="green">

                1314</font> RUB
            )
        </li>

        <li>
            <strong>MA</strong> 4 (

                <font color="red">

                -14.87</font> USD
            )
        </li>

</ol>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...