Go自定义模板函数的参数
Parameter to Go custom template function
请看https://play.golang.org/p/EbWA15toVa9
其中我
- 在第 25 行定义
func iterate(count int) []int
- 在第 15 行用
iterate 5
调用它
没关系,但是,当在第 20 行用 iterate (printf "%d" 3)
调用它时,我得到了错误:
template: t:12:39: executing "t" at <3>: wrong type for value; expected int; got string
难道(printf "%d" 3)
不会先被执行,然后传给iterate
,它会变成iterate 3
吗?为什么会出现上述错误?
附上完整代码:
package main
import (
"log"
"os"
"text/template"
)
var x = `{{define "t1"}}
{{- index . 0}} {{index . 1}} {{index . 2}} {{index . 3}}
{{end -}}
hello, {{template "t1" args . 543 false 0.1234}}
{{- range $val := iterate 5 }}
{{ $val }}
{{- end }}
{{ (printf "%d" 3) }}
{{- range $val := iterate (printf "%d" 3) }}
{{ $val }}
{{- end }}
`
func iterate(count int) []int {
var i int
var Items []int
for i = 0; i < (count); i++ {
Items = append(Items, i)
}
return Items
}
func args(vs ...interface{}) []interface{} { return vs }
func main() {
t := template.Must(template.New("t").Funcs(template.FuncMap{"args": args, "iterate": iterate}).Parse(x))
err := t.Execute(os.Stdout, "foobar")
if err != nil {
log.Fatal(err)
}
}
printf “%d” 3
首先被评估是正确的。问题似乎是 printf “%d” 3
生成了一个字符串,但是您的 iterate
函数有一个类型为 int
的参数。 string
不会被转换。
请看https://play.golang.org/p/EbWA15toVa9
其中我
- 在第 25 行定义
func iterate(count int) []int
- 在第 15 行用
iterate 5
调用它
没关系,但是,当在第 20 行用 iterate (printf "%d" 3)
调用它时,我得到了错误:
template: t:12:39: executing "t" at <3>: wrong type for value; expected int; got string
难道(printf "%d" 3)
不会先被执行,然后传给iterate
,它会变成iterate 3
吗?为什么会出现上述错误?
附上完整代码:
package main
import (
"log"
"os"
"text/template"
)
var x = `{{define "t1"}}
{{- index . 0}} {{index . 1}} {{index . 2}} {{index . 3}}
{{end -}}
hello, {{template "t1" args . 543 false 0.1234}}
{{- range $val := iterate 5 }}
{{ $val }}
{{- end }}
{{ (printf "%d" 3) }}
{{- range $val := iterate (printf "%d" 3) }}
{{ $val }}
{{- end }}
`
func iterate(count int) []int {
var i int
var Items []int
for i = 0; i < (count); i++ {
Items = append(Items, i)
}
return Items
}
func args(vs ...interface{}) []interface{} { return vs }
func main() {
t := template.Must(template.New("t").Funcs(template.FuncMap{"args": args, "iterate": iterate}).Parse(x))
err := t.Execute(os.Stdout, "foobar")
if err != nil {
log.Fatal(err)
}
}
printf “%d” 3
首先被评估是正确的。问题似乎是 printf “%d” 3
生成了一个字符串,但是您的 iterate
函数有一个类型为 int
的参数。 string
不会被转换。