一尘不染

`import`语句的用法

go

有人可以向我解释该import声明的工作方式吗?

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

package models

type User struct {
    // exportod fields
}

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
}

这给了我以下错误:

undefined: User

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

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

但是得到这个错误:

undefined: "myapp/app/controllers".User

我也不明白。那么,import . "something"和之间有什么区别import "something"?如何正确设置import我的模型?


阅读 410

收藏
2020-07-02

共1个答案

一尘不染

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

一个包只能访问另一个包的导出实体。为此,需要这样做import,这将使导出的实体可用包名称作为标识符。例:

import "github.com/revel/revel"

将获取revel包的所有导出实体,可使用revel.前缀使用。如中的revel.Controller,这是包中Controller定义的类型revel

您可以通过在导入路径前面加上所需的标识符来为软件包标识符加上别名。例:

import rev "github.com/revel/revel"

将导入所有revel具有标识符的实体rev。如此revel.Controller成为rev.Controller。如果您有多个具有相同名称的软件包,或者一个名称太长的软件包,则很有用。

另外,您可以通过将别名别名为空白标识符来匿名导入软件包:

import _ "github.com/revel/revel"

它将导入包,但不能让您访问导出的实体。它对于诸如驱动程序之类的东西很有用,您需要导入但永不访问。数据库驱动程序是一个常见的示例,该数据库驱动程序将自身注册到database/sql软件包中,因此您无需直接访问它们。

作为奖励,您还可以在本地导入软件包,方法是使用.标识符作为别名。这样就可以在没有标识符的情况下使用导出的实体,就像在同一包中定义它们一样。

How to properly import your packages is up to you. The general convention is
to never alias if you can manage it, to hide the package that you don’t need
to access but still need to import (database drivers), and that’s all. You
really never need to import locally a package, even if some tutorials or
frameworks do it for simplicity’s sake.

2020-07-02