Как я могу предотвратить использование значений, отличных от nil, от шаблона golang, если блок nil - PullRequest
0 голосов
/ 07 февраля 2019

Следующее некорректно показывает «ноль» для значений 0, но я хочу, чтобы это делалось только для точно nil.

package main

import (
    "os"
    "text/template"
)

type thing struct {
    Value interface{}
}

func main() {
    tmpl, _ := template.New("test").Parse("{{if .Value }} {{.Value}} {{else}} [null] {{end}}\n")
    tmpl.Execute(os.Stdout, thing{Value: "hi"}) // outputs hi
    tmpl.Execute(os.Stdout, thing{Value: nil})  // outputs [null]
    tmpl.Execute(os.Stdout, thing{Value: 0})    // outputs [null] - should output 0
    tmpl.Execute(os.Stdout, thing{Value: 2})    // outputs 2
}

Ссылка на игровую площадку: https://play.golang.org/p/Gg8uBCOb2vE

Как сделать так, чтобы вместо этого показывалось значение 0?

.Value - это interface{}, которое в проблемном случае содержит int, но может содержать что угодно.

Показывать содержимое по умолчанию в шаблоне, если объект равен нулю, в противном случае показывать на основе установленного свойства близко, но не совсем то же самое

1 Ответ

0 голосов
/ 07 февраля 2019

Я бы просто создал функцию, которую вы передаете шаблону, используя template.Funcs:

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

funcs := make(map[string]interface{})
funcs["isNotNull"] = func(t interface{}) bool {
    return t != nil
}
tmpl, _ := template.New("test").Funcs(funcs).Parse("{{if isNotNull .Value }} {{.Value}} {{else}}[null] {{end}}\n")
tmpl.Execute(os.Stdout, thing{Value: "hi"}) // outputs hi
tmpl.Execute(os.Stdout, thing{Value: nil})  // outputs [null]
tmpl.Execute(os.Stdout, thing{Value: 0})    // outputs 0
tmpl.Execute(os.Stdout, thing{Value: 2})    // outputs 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...