¿Cómo pasar múltiples datos a la plantilla Go?
go-templates (2)
Debe definir una estructura rellenada con la consulta de resultados de la base de datos, luego asignar esa estructura al método
Execute
.
tmpl.Execute
requiere una interfaz de
Writer
y una
struct
type Inventory struct {
Material string
Count uint
}
items := Inventory{"trouser", 1}
if err := GetTemplate("list").Execute(w, items); err != nil {
// ... do your work
}
Quiero pasar dos objetos de datos a Go Template. Uno es un resultado de consulta MongoDB y otro es una matriz de enteros.
Consulta MongoDB: -
var results []User
sess, db := GetDatabase()
defer sess.Close()
c := db.C("user")
err := c.Find(nil).All(&results)
Quiero enviar ''resultado'' y una matriz int a través del siguiente código
GetTemplate("list").Execute(w,???????)
Si solo hay un resultado db, podríamos usarlo como
GetTemplate("list").Execute(w,results)
y en la plantilla podríamos acceder a ella {{.Name}} etc. (donde Nombre es un campo de estructura de [] Usuario)
Por favor, dígame cómo pasar estos datos y cómo acceder a ellos en la plantilla.
Puede ajustar múltiples datos destinados a la plantilla en una
struct
o en un
map
.
Ejemplo con una
struct
:
type Data struct {
Results []User // Must be exported!
Other []int // Must be exported!
}
data := &Data{results, []int{1, 2, 3}}
if err := GetTemplate("list").Execute(w, data); err != nil {
// Handle error
}
También tenga en cuenta que no se requiere un nuevo tipo con nombre, también puede usar un literal de estructura anónimo, que podría verse así:
data := struct {
Results []User // Must be exported!
Other []int // Must be exported!
}{results, []int{1, 2, 3}}
Ejemplo con un
map
:
m := map[string]interface{}{
"Results": results,
"Other": []int{1, 2, 3},
}
if err := GetTemplate("list").Execute(w, m); err != nil {
// Handle error
}
Tenga en cuenta que al usar un mapa, no es necesario usar
string
mayúscula s como teclas, por ejemplo, podría haber usado
"results"
y
"other"
también (pero en mi opinión, es mejor usar teclas con letras mayúsculas, si se mueve para
struct
veces en el futuro, tendría que hacer menos correcciones).
En ambos casos, puede referirse a los resultados del
[]User
con
{{.Results}}
y al segmento int adicional con
{{.Other}}
.
Entonces, por ejemplo, para abarcar a los usuarios:
{{range .Results}}
User name:{{.Name}}
{{end}}