谁能解释一下这个import陈述是如何运作的?
例如,我User在myapp/app/models包中有一个类型:
package models
type User struct {
// exportod fields
}
Run Code Online (Sandbox Code Playgroud)
我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
}
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
undefined: User
我尝试将导入更改为以下代码:
import (
. "advorts/app/models"
"github.com/revel/revel"
)
Run Code Online (Sandbox Code Playgroud)
但得到这个错误:
undefined: "myapp/app/controllers".User
我也不明白.那么,import . "something"和之间有什么区别import "something"?如何import在我的案例中正确使用我的模型?
每个包都有一组类型,函数,变量等.让我们称它们为实体.每个实体都可以导出(其名称以大写字母开头)或未导出(其名称以小写字母开头).
包只能访问另一个包的导出的entites.要做到这一点,它需要import它,这将使导出的entites可用包名作为标识符.例:
import "github.com/revel/revel"
Run Code Online (Sandbox Code Playgroud)
将获得revel包的所有导出的entites ,将使用revel.前缀.如在revel.Controller,包中Controller定义的类型revel.
您可以通过在导入路径前添加所需标识符来为包标识符添加别名.例:
import rev "github.com/revel/revel"
Run Code Online (Sandbox Code Playgroud)
将revel使用标识符导入所有entites rev.因此revel.Controller变得rev.Controller.如果您有多个具有相同名称的包或具有荒谬长名称的包,则它非常有用.
作为奖励,您可以匿名导入包,方法是将其别名为空白标识符:
import _ "github.com/revel/revel"
Run Code Online (Sandbox Code Playgroud)
它将导入包,但不允许您访问导出的实体.它对于像您需要导入但从不访问的驱动程序这样的东西很有用.一个常见的例子是数据库驱动程序,它们将自己注册到database/sql包中,因此您永远不需要直接访问它们.
作为额外奖励,您还可以通过使用.标识符对其进行别名来本地导入包.然后,导出的entites将在没有标识符的情况下可用,就像您在同一个包中定义它们一样.
如何正确导入您的包取决于您.一般约定是永远别名,如果你可以管理它,隐藏你不需要访问但仍需要导入的包(数据库驱动程序),就是这样.你真的永远不需要在本地导入一个包,即使一些教程或框架为了简单起见而这样做.