Как передать несколько данных в шаблон 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}}
Другие вопросы по тегам