使用`import`语句

时间:2014-06-26 07:43:26

标签: import go

有人可以解释一下import语句的工作原理吗?

例如,我在User包中有myapp/app/models类型:

package models

type User struct {
    // exportod fields
}

我在Users包中有myapp/app/controllers类型:

package controllers

import (
    _ "myapp/app/models"
    "github.com/revel/revel"
)

type Users struct {
    *revel.Controller
}

func (c Users) HandleSubmit(user *User) revel.Result {
    // Code here
}

这给了我以下错误:

  

undefined: User

我尝试将导入更改为以下代码:

import (
    . "advorts/app/models"
    "github.com/revel/revel"
)

但是得到这个错误:

  

undefined: "myapp/app/controllers".User

我也不明白。那么,import . "something"import "something"之间有什么区别?如何在我的案例中正确import我的模型?

1 个答案:

答案 0 :(得分:5)

每个包都有一组类型,功能,变量等。让我们称它们为实体。每个实体都可以导出(其名称以大写字母开头)或未导出(其名称以小写字母开头)。

包只能访问另一个包的导出的entites。要做到这一点,它需要import它,这将使导出的entites可用包名作为标识符。例如:

import "github.com/revel/revel"

将获取revel个包的所有导出的entites,这些包将使用revel.前缀提供。与revel.Controller中一样,Controller包中定义的revel类型。

您可以通过在导入路径前添加所需标识符来为别名标识符添加别名。例如:

import rev "github.com/revel/revel"

将导入标识为revel的所有rev个网友。因此revel.Controller变为rev.Controller。如果您有多个具有相同名称的包,或者包含名称非常长的包,这将非常有用。

作为奖励,您可以匿名导入包,方法是将其别名为空白标识符:

import _ "github.com/revel/revel"

将导入包,但不允许您访问导出的实体。它对于像您需要导入但从不访问的驱动程序这样的东西很有用。一个常见的例子是数据库驱动程序,它们将自己注册到database/sql包,因此您永远不需要直接访问它们。

作为奖励'奖励,您还可以通过使用.标识符对其进行别名来本地导入包。然后,导出的entites将在没有标识符的情况下可用,就像您在同一个包中定义它们一样。

如何正确导入您的包取决于您。一般惯例是,如果您可以管理它,隐藏您不需要访问但仍需要导入的数据包(数据库驱动程序),那就永远不会是别名。你真的永远不需要在本地导入一个包,即使一些教程或框架是为了简单起见而做的。