我想创建一个golang模板,如果没有提供参数,则使用默认值,但如果我尝试在模板中使用or
函数,则会出现此错误:
template: t2:2:20: executing "t2" at <index .table_name 0>: error calling index: index of untyped nil
以下是代码示例:https://play.golang.org/p/BwlpROrhm6
// text/template is a useful text generating tool.
// Related examples: http://golang.org/pkg/text/template/#pkg-examples
package main
import (
"fmt"
"os"
"text/template"
)
var fullParams = map[string][]string{
"table_name": []string{"TableNameFromParameters"},
"min": []string{"100"},
"max": []string{"500"},
}
var minimalParams = map[string][]string{
"min": []string{"100"},
"max": []string{"500"},
}
func check(err error) {
if err != nil {
fmt.Print(err)
}
}
func main() {
// Define Template
t := template.Must(template.New("t2").Parse(`
{{$table_name := (index .table_name 0) or "DefaultTableName"}}
Hello World!
The table name is {{$table_name}}
`))
check(t.Execute(os.Stdout, fullParams))
check(t.Execute(os.Stdout, minimalParams))
}
谷歌搜索指出我hugo's template engine中的isset
函数,但我无法弄清楚它们是如何实现的,我不确定它是否能解决我的问题。
答案 0 :(得分:4)
另一种解决方案是将模板定义更改为
// Define Template
t := template.Must(template.New("t2").Parse(`
Hello World!
The table name is {{with .table_name}}{{index . 0}}{{else}}DefaultTableName{{end}}
`))
但是,该值不会存储在变量中,因此如果您想在其他地方重复使用它,则需要再次编写它。标准模板包的主要用途是用于呈现预先计算的值,而与逻辑相关的操作/功能具有有限的功能。但是,您可以定义自己的function
,然后将其注册到模板FuncMap,例如@jeevatkm提到的default
函数。
答案 1 :(得分:1)
Go模板没有default
功能。但是,您可以使用提供default
func。
例如:github.com/leekchan/gtf
请参阅此处,如何在https://github.com/leekchan/gtf/blob/master/gtf.go#L28
实施答案 2 :(得分:1)
您可以在模板中使用函数 or
。这似乎是最简单的选择。
{or .value "Default"}
来自文档:
or
Returns the boolean OR of its arguments by returning the
first non-empty argument or the last argument, that is,
"or x y" behaves as "if x then x else y". All the
arguments are evaluated.