template not golang equal conditions go go-templates

go - not - Ir a la función de plantilla



golang template range (2)

La respuesta de Sonia es técnicamente correcta, pero me dejó aún más confundido. Así es como eventualmente lo puse en funcionamiento:

t, err := template.New("_base.html").Funcs(funcs).ParseFiles("../view/_base.html", "../view/home.html") if err != nil { fmt.Fprint(w, "Error:", err) fmt.Println("Error:", err) return } err = t.Execute(w, data) if err != nil { fmt.Fprint(w, "Error:", err) fmt.Println("Error:", err) }

El nombre de la plantilla es el nombre de archivo de la plantilla, no la ruta completa. Execute ejecutará la plantilla predeterminada siempre que tenga un nombre que coincida, por lo que no es necesario utilizar ExecuteTemplate .

En este caso, el archivo _base.html es el contenedor más externo, por ejemplo:

<!DOCTYPE html> <html><body> <h1>{{ template "title" }}</h1> {{ template "content" }} </body></html>

mientras home.html define las partes específicas:

{{ define "title" }}Home{{ end }} {{ define "content" }} Stuff {{ end }}

Noté algo extraño con las plantillas de Go cuando intento usar Funcs y FuncMap . El siguiente código funciona como se espera:

buffer := bytes.NewBufferString("") funcMap := template.FuncMap{ "label": strings.Title, } t, _ := template.New("alex").Funcs(funcMap).Parse("{{label /"alex/"}}") t.Execute(buffer, "") return string(buffer.Bytes()) //=> "Alex"

Pero cuando trato de poner la plantilla en un archivo, no funciona ( Execute() dice: "alex" is an incomplete or empty template ):

t, _ := template.New("alex").Funcs(funcMap).ParseFiles("template.html")

Con template.html:

{{label /"alex/"}}

¿Alguna idea de por qué? ¿Es esto un error? ¿Hay formas más simples de usar métodos / funciones en plantillas?


ParseFiles probablemente podría utilizar una mejor documentación. Un objeto de plantilla puede tener varias plantillas y cada uno tiene un nombre. Si observa la implementación de ParseFiles, verá que usa el nombre del archivo como el nombre de la plantilla dentro del objeto de la plantilla. Entonces, asigne a su archivo el mismo nombre que al objeto de la plantilla (probablemente no sea práctico en general) o use ExecuteTemplate en lugar de solo Execute.