Revel: код не компилируется: undefined: models

Я создал файл /app/models/todo-item.go, который выглядит так:

package models

import (
  "github.com/revel/revel"
)

type TodoItem struct {
  Id              int64   `db:"id" json:"id"`
  Name            string  `db:"name" json:"name"`
}

func (b *TodoItem) Validate(v *revel.Validation) {

  v.Check(b.Name,
    revel.ValidRequired(),
    revel.ValidMaxSize(25))
}

В src/RevelApp/app/controllers/init.go у меня есть это (PS, я использую GorpController для взаимодействия с MySQL):

func defineTodoItemTable(dbm *gorp.DbMap){
  // set "id" as primary key and autoincrement
  t := dbm.AddTable(models.TodoItem{}).SetKeys(true, "id") 
  t.ColMap("name").SetMaxSize(25)
}

Я получаю сообщение об ошибке: Код Go src/RevelApp/app/controllers/init.go не компилируется: undefined: models

Я попытался импортировать «RevelApp/app/models», а затем избавиться от моделей в models.TodoItem{} (как описано здесь: Revel with Gorm undefined: Page), и я получаю сообщение об ошибке: Приложению не удалось запустить revel/harness: время ожидания приложения истекло.

Эта ссылка - единственная, которую я мог найти, связанную с этой проблемой. Я что-то пропустил?

ИЗМЕНИТЬ: $GOPATH:

/home/me/Source/go

Расположение моделей:

/home/me/Source/go/src/RevelApp/app/models

Как я импортирую пакет моделей:

import (
    ."RevelApp/app/models"
    "github.com/revel/revel"
    "github.com/coopernurse/gorp"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "fmt"
    "strings"
)

person Mardwan    schedule 12.11.2014    source источник
comment
Это может быть связано с GOPATH — можете ли вы показать нам, как вы импортируете пакет models и где он находится относительно вашего GOPATH?   -  person Simon Whitehead    schedule 12.11.2014
comment
Я отредактировал вопрос с тем, что вы просили   -  person Mardwan    schedule 12.11.2014


Ответы (1)


Вы импортировали свои модели, используя квалификатор импорта точка (.). Из спецификации языка:

Если вместо имени появляется явная точка (.), все экспортированные идентификаторы пакета будут объявлены в блоке файла текущего файла, и к ним можно будет получить доступ без квалификатора.

Это означает, что вам не нужно использовать models.TodoItem .. вы можете просто использовать TodoItem.

Тем не менее.. Я бы предложил избежать этого и удалить точку из оператора импорта:

import (
    "RevelApp/app/models"
    "github.com/revel/revel"
    "github.com/coopernurse/gorp"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "fmt"
    "strings"
)

Почему? Это предотвращает переполнение вашей локальной файловой области и позволяет вам увидеть, где на самом деле находится каждый объект.

Для полноты (и вам, вероятно, интересно, для чего это нужно, поскольку точка похожа), подчеркивание (_) перед оператором пакета mysql в основном говорит: «импортировать этот пакет ... но мне не нужно что-либо использовать в нем напрямую» . Это запускает функцию пакетов init, позволяя ей зарегистрироваться в подпрограммах пакетов database/sql. Вот почему, когда вы используете тип sql.DB, он в конечном итоге направляется в код пакета MySql.

person Simon Whitehead    schedule 12.11.2014
comment
Привет. Спасибо за этот ответ. К сожалению, ваше предложение — это первый способ, которым я это сделал, и все еще получаю ошибку «импортировано и не используется: RevelApp/app/models». Я использовал только (.), потому что единственная другая проблема, которую я смог найти в Google, предложила это решение в предоставленном ответе. - person Mardwan; 13.11.2014
comment
@Mardwan, затем удалите . из своего примера кода. Если вы это сделаете, это должно сработать. Если у вас все еще есть ошибка, нам нужно больше деталей, чтобы выяснить, в чем настоящая проблема. - person Brenden; 06.01.2015