使用`import`语句

cna*_*ize 0 import go

谁能解释一下这个import陈述是如何运作的?

例如,我Usermyapp/app/models包中有一个类型:

package models

type User struct {
    // exportod fields
}
Run Code Online (Sandbox Code Playgroud)

Usersmyapp/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在我的案例中正确使用我的模型?

Elw*_*nar 5

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

包只能访问另一个包的导出的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将在没有标识符的情况下可用,就像您在同一个包中定义它们一样.

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