TL; DR;
您必须检查
error返回的值,
template.Execute()或者
template.ExecuteTemplate()它将告诉您为什么它不适合您。
可能出错的事情
首先,执行不会惊慌,因为它只会返回错误。您检查一下,您可能会立即知道出了什么问题:
if err := t.Execute(os.Stdout, data); err != nil { panic(err)}
接下来可能出问题的原因:您必须 在 解析模板 之前
注册自定义函数,因为模板引擎需要能够静态分析模板,并且它需要事先知道这
IsIPv4是一个函数名:
t := template.Must(template.New("").Funcs(template.FuncMap{ "IsIPv4": isIPv4,}).Parse(templ))
另一个潜在的错误是
isIPv4()期望类型为的值
string,并且您可能会传递不同类型的值。
nil如果您打算停止执行模板,则为模板注册的自定义功能应仅返回非错误。因为这是如果您返回的情况
error。
template.FuncMap:
工作实例[…]如果在执行期间第二个(错误)返回值的计算结果为非零,则执行终止,并且Execute返回该错误。
这是一个使用您的模板和
isIPv4()函数的工作示例:
t := template.Must(template.New("").Funcs(template.FuncMap{ "IsIPv4": isIPv4,}).Parse(templ))m := map[string]interface{}{ "Addresses": []string{"127.0.0.1", "0:0:0:0:0:0:0:1"},}if err := t.Execute(os.Stdout, m); err != nil { panic(err)}
输出(在Go Playground上尝试):
潜在错误IPv4: 127.0.0.1IPv6: 0:0:0:0:0:0:0:1
上面的程序打印以下错误:
传递无效的IP:
"Addresses": []string{"127.0.0.1.9"},
输出:
panic: template: :2:6: executing "" at <IsIPv4 .>: error calling IsIPv4: The argument is not an IP address
传递非
string值:
"Addresses": []interface{}{2},
输出:
panic: template: :2:13: executing "" at <.>: wrong type for value; expected string; got int
模板解析 后 尝试注册您的自定义函数:
t := template.Must(template.New("").Parse(templ))t.Funcs(template.FuncMap{ "IsIPv4": isIPv4,})
输出:
panic: template: :2: function "IsIPv4" not defined
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)