1

我创建了 /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 无法编译:未定义:模型

我尝试导入 ."RevelApp/app/models" 然后删除 models.TodoItem{} 中的模型(如这里的描述:Revel with Gorm "undefined: Page"),我收到错误:App failed to start up revel/线束:应用程序超时

该链接是我能找到的与此问题相关的唯一链接。我错过了什么吗?

编辑:$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"
)
4

1 回答 1

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 包代码。

于 2014-11-12T10:44:17.910 回答