Vorlage und benutzerdefinierte Funktion; Panik: Funktion nicht definiert
Mit html/template
ich bin versucht, einen meiner eigenen Funktionen innerhalb einer Vorlage. Leider bin ich nicht die Funktion-Karte Funktion-go-Vorlagen. Ich erhalte die folgende Fehlermeldung:
% go run test.go
panic: template: tmpl.html:5: function "humanSize" not defined
[...]
Den reduzierten testcase sieht wie folgt aus (test.go
):
package main
import (
"html/template"
"io/ioutil"
"net/http"
"strconv"
)
var funcMap = template.FuncMap{
"humanSize": humanSize,
}
var tmplGet = template.Must(template.ParseFiles("tmpl.html")).Funcs(funcMap)
func humanSize(s int64) string {
return strconv.FormatInt(s/int64(1000), 10) + " KB"
}
func getPageHandler(w http.ResponseWriter, r *http.Request) {
files, _ := ioutil.ReadDir(".")
if err := tmplGet.Execute(w, files); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func main() {
http.HandleFunc("/", getPageHandler)
http.ListenAndServe(":8080", nil)
}
Und ich habe die folgende einfache Vorlage (tmpl.html
):
<html><body>
{{range .}}
<div>
<span>{{.Name}}</span>
<span>{{humanSize .Size}}</span>
</div>
{{end}}
</body></html>
Dies ist gehen 1.1.1.
Du musst angemeldet sein, um einen Kommentar abzugeben.
IIRC, template-Funktionen anzeigen, müssen definiert werden, indem
.Funcs
vor der Analyse der Vorlage. Der folgende code scheint zu funktionieren.var tmplGet = template.Must(template.New("base.html").Funcs(funcMap).ParseFiles("tmpl/base.html", "tmpl/get.html"))
, weil ich mit verschachtelten Vorlagen. Hier ein weiterer gotcha ist, dassNew()
haben muss, um den gleichen Basisnamen wie die "top-level" - Vorlage.Die Lösung ist, um den gleichen Namen in der Funktion New() und ParseFiles() eine vorgeschlagene von @user321277