Не могу оценить поле в интерфейсе - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь получить данные из коллекции монго, используя данные из другой коллекции.Но он отказывается работать, так как возвращает http: panic serving [::1]:51494: template: display.html:27:27: executing "builds.display" at <.TalentData>: can't evaluate field TalentData in type buildcontroller.Build

type Build struct {
    Id bson.ObjectId `bson:"_id,omitempty"`
    Name string `bson: "name,omitempty"` 
    CreatedAt *time.Time `bson: "createdAt,omitempty"` 
    UpdatedAt *time.Time `bson: "updatedAt,omitempty"` 
    Author bson.ObjectId `bson: "author,omitempty"` 
    Class bson.ObjectId `bson: "class,omitempty"` 
    Talents []int64 `bson: "talents,omitempty"`
}

type Talents struct {
    Id bson.ObjectId `bson:"_id,omitempty"`
    Name string `bson: "name,omitempty"` 
    Description string `bson: "description,omitempty"` 
    Class bson.ObjectId `bson: "class,omitempty"` 
}

type IndexData struct {
    PageTitle       string
    BuildData       interface{}
    TalentData      interface{}
}

func Display(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)

    if !bson.IsObjectIdHex(vars["id"]) {
        err := template.NotFoundTemplate.ExecuteTemplate(w, "skeleton", IndexData{PageTitle: "Page Not Found"})
        if err != nil {
            log.Panic(err)
        }

        return
    }

    session := database.GetMongoSession()
    defer session.Close()

    c := session.DB(config.Settings.Database.Name).C("builds")
    var result []Build
    var class bson.ObjectId

    err := c.Find(bson.M{"_id": bson.ObjectIdHex(vars["id"])}).All(&result)
    if err != nil {
        w.WriteHeader(http.StatusNotFound)
    }

    for _, v := range result {
        class = v.Class
    }

    talents, err := getTalents(class)
    if err != nil {
        log.Fatal(err)
    }

    data := IndexData{
        PageTitle:       "test",
        BuildData:       result,
        TalentData:      talents,
    }

    err = template.BuildDisplayTemplate.ExecuteTemplate(w, "skeleton", data)
    if err != nil {
        log.Panic(err)
    }
}

func getTalents(class bson.ObjectId) (interface{}, error) {
    session := database.GetMongoSession()
    defer session.Close()

    c := session.DB(config.Settings.Database.Name).C("talents")
    var result []Talents

    err := c.Find(bson.M{"class": class}).All(&result)
    if err != nil {
        return nil, err
    }

    return result, nil
}

Я нахожу это странным, потому что result и talents должны возвращать данные, отформатированные таким же образом, а result работает нормально.

{{ range $data := .BuildData }} <- This works
    {{ $data.Name }}
    {{ range $talent := .TalentData }} <- Nope.
        {{$talent.Description}}
    {{ end }}
{{ end }}

Я сравнил выходные данные обеих переменных и, как я уже сказал, они практически одинаково отформатированы?

talents = [{ObjectIdHex("5c9fa88fe86deef65491c31e") Test Something ObjectIdHex("5c9fa8cfe86deef65491c31f")} {ObjectIdHex("5c9faa68cb216df65405dc5b") Hello Something ObjectIdHex("5c9fa8cfe86deef65491c31f")}]

result = [{ObjectIdHex("5c9f89bde86deef65491c31d") Test <nil> <nil> ObjectIdHex("5c9faa10e86deef65491c320") ObjectIdHex("5c9fa8cfe86deef65491c31f") []}]

Что мне здесь не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...