【发布时间】:2016-07-26 09:55:29
【问题描述】:
我正在尝试定义一个自定义 Go 函数以在模板条件中使用。 我想要实现的是:如果给定的参数是 IPv4 地址,则模板将输出 IPv4: [argument] 否则它将输出 IPv6: [argument]。 p>
为此,我创建了一个这样的模板:
{{ range .Addresses }}
{{ if IsIPv4 . }}
IPv4: {{ . }}
{{ else }}
IPv6: {{ . }}
{{ end }}
{{ end }}
如您所见,我创建了一个名为 IsIPv4 的新函数,它接受一个字符串参数并给定参数返回真或假。代码如下:
var (
errNotAnIPAddress = errors.New("The argument is not an IP address")
)
func isIPv4(address string) (bool, error) {
ip := net.ParseIP(address)
if ip == nil {
return false, errNotAnIPAddress
}
return (ip.To4() != nil), nil
}
执行我的模板时,我没有遇到任何错误,但是在尝试评估 {{ if IsIPv4 时,执行似乎停止了。 }}。
当然,函数是在尝试解析和执行模板之前映射的。
funcMap := template.FuncMap{
"IsIPv4": isIPv4,
}
我对 Go 很陌生,我可能错过了一些东西(可能很明显?)。
为了稍微调试一下,我尝试在模板中删除 IsIPv4 调用,给出类似 {{ if 的条件。 }}。结果总是输出IPv4:[IP 地址]。这对我来说很有意义。
我还查看了预定义的 Go 函数,例如 eq,看起来我正在尝试重现相同的想法,但没有任何成功。
【问题讨论】:
-
您是否将函数映射
funcMap添加到模板中?您需要调用模板的Funcs方法来执行此操作。详情:golang.org/pkg/text/template/#Template.Funcs -
@abhink 我当然做到了。否则它会告诉我在解析模板时没有定义函数。