有人可以解释一下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
我的模型?
答案 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将在没有标识符的情况下可用,就像您在同一个包中定义它们一样。
如何正确导入您的包取决于您。一般惯例是,如果您可以管理它,隐藏您不需要访问但仍需要导入的数据包(数据库驱动程序),那就永远不会是别名。你真的永远不需要在本地导入一个包,即使一些教程或框架是为了简单起见而做的。