Как передать несколько данных в шаблон Go?
Я хочу передать два объекта данных в шаблон Go. Один из них - результат запроса MongoDB, а другой - целочисленный массив.
Запрос MongoDB:-
var results []User
sess, db := GetDatabase()
defer sess.Close()
c := db.C("user")
err := c.Find(nil).All(&results)
Я хочу отправить 'результат' и массив int через следующий код
GetTemplate("list").Execute(w,???????)
Если есть только результат дБ, мы могли бы использовать его как
GetTemplate("list").Execute(w,results)
и в шаблоне мы можем получить к нему доступ {{.Name}} и т. д. (где Name является структурным полем []User)
Подскажите пожалуйста как передать эти данные и как получить к ним доступ в шаблоне.
3 ответа
Вы можете обернуть несколько данных, предназначенных для шаблона, в struct
или в map
,
Пример с 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
}
Также обратите внимание, что новый именованный тип не требуется, вы также можете использовать анонимный структурный литерал, который может выглядеть следующим образом:
data := struct {
Results []User // Must be exported!
Other []int // Must be exported!
}{results, []int{1, 2, 3}}
Пример с map
:
m := map[string]interface{}{
"Results": results,
"Other": []int{1, 2, 3},
}
if err := GetTemplate("list").Execute(w, m); err != nil {
// Handle error
}
Обратите внимание, что при использовании карты использование заглавных букв не обязательно. string
в качестве ключей, например, вы могли бы использовать "results"
а также "other"
тоже (но, по моему мнению, лучше использовать ключи с заглавными буквами, если вы перейдете к struct
иногда в будущем у вас будет меньше исправлений).
В обоих случаях вы можете обратиться к []User
результаты с {{.Results}}
и к дополнительному int срез с {{.Other}}
,
Так, например, чтобы охватить пользователей:
{{range .Results}}
User name:{{.Name}}
{{end}}
Вы должны определить структуру, заполненную запросом результатов базы данных, а затем присвоить эту структуру Execute
метод.
tmpl.Execute
требовать Writer
интерфейс и struct
type Inventory struct {
Material string
Count uint
}
items := Inventory{"trouser", 1}
if err := GetTemplate("list").Execute(w, items); err != nil {
// ... do your work
}
Вы можете поместить свои структуры внутрь другой структуры, используя
range
ключевое слово. например
type Data struct {
Users []User
Developers []Developer
}
var data = Data{
Users: ...,
Developers: ...,
}
err := t.Execute(w, &data)
if err != nil {
panic(err)
}
{{range .Users}}{{.UserName}}
{{end}}
{{range .Developers}}{{.DeveloperName}}
{{end}}