go - 自定义功能在模板中不起作用
问题描述
我有以下工作正常的操场
package main
import (
"html/template"
"os"
)
func main() {
tmpl := `
{{ $slice := mkSlice "a" 5 "b" }}
{{ range $slice }}
{{ . }}
{{ end }}
`
funcMap := map[string]interface{}{"mkSlice": mkSlice}
t := template.New("").Funcs(template.FuncMap(funcMap))
template.Must(t.Parse(tmpl))
t.Execute(os.Stdout, nil)
}
func mkSlice(args ...interface{}) []interface{} {
return args
}
但是一旦我尝试从模板文件运行,什么都没有显示,也没有收到错误!
func mkSlice(args ...interface{}) []interface{} { // to ceate the array in the template
return args
}
funcMap := map[string]interface{}{"mkSlice": mkSlice}
tmpl := template.New("").Funcs(template.FuncMap(funcMap))
template.Must(tmpl.ParseFiles("index.html"))
tmpl.Execute(w, nil)
并且index.html
是:
{{ $slice := mkSlice "a" 5 "b" }}
{{ range $slice }}
<span> {{ . }} </span>
{{ end }}
任何想法?
解决方案
您看不到任何错误,因为您没有检查tmpl.Execute(w, nil)
. 何时检查:
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}
您将看到如下输出:
panic: template: "" is an incomplete or empty template
不同之处在于,在第一种情况下,您使用了Template.Parse()
以下方法:
... 将文本解析为 t 的模板主体。
请注意,您解析的模板文本将用于t
其自身!
在第二种情况下,您使用Template.ParseFiles()
了 which:
... 解析命名文件并将生成的模板与 t 相关联。如果发生错误,则停止解析,返回的模板为 nil;否则为 t。必须至少有一个文件。由于 ParseFiles 创建的模板由参数文件的基本名称命名,因此 t 通常应该具有文件的(基本)名称之一的名称。
因此,在您的第一个示例t
中包含一个模板,并且该单个模板将由Template.Execute()
.
在您的第二个示例t
中,包含多个关联模板,t
它们本身是一个空模板,另一个关联模板名为index.html
. 您可以使用以下命令执行该模板Template.ExecuteTemplate()
:
if err := t.ExecuteTemplate(os.Stdout, "index.html", nil); err != nil {
panic(err)
}
有关更多信息,请参阅:
推荐阅读
- file - Zend 文件路径问题
- javascript - 无法通过在 Python 中使用 execute_script 进行网页抓取来获取所有 html 代码
- java - 如何平滑地执行放大和缩小并在 TEXTVIEW 上放大特定的缩放位置?
- vba - Excel:从 1 个单元格复制文本并将其添加到其旁边单元格的顶部
- java - Java Selenium-如何从 AWSUI Lambda 结果中的 textarea 获取文本
- python - 使用 python `mutliprocessing.Process().daemon=True` 创建的进程是真正的守护进程吗?
- python - 将错误传递给django中views.py中的重定向模板
- mongodb - Rest api - MongoNetworkError:无法连接到服务器
- python - 在模块之间导入全局变量
- docker - 为什么 Graphite 安装需要 docker