Использование функции шаблона может быть лучшим способом сделать это.
В следующем примере кода я определил функцию 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>