当前位置: 首页 > 面试题库 >

`import`语句的用法

苏雅珺
2023-03-14
问题内容

有人可以向我解释该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我的模型?


问题答案:

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

一个包只能访问另一个包的导出实体。为此,需要这样做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.




 类似资料:
  • 如果你想要直接输入argv变量到你的程序中(避免在每次使用它时打sys.),那么你可以使用from sys import argv语句。如果你想要输入所有sys模块使用的名字,那么你可以使用from sys import *语句。这对于所有模块都适用。一般说来,应该避免使用from..import而使用import语句,因为这样可以使你的程序更加易读,也可以避免名称的冲突。

  • 每个spark程序都有这行。当我上网了解scala中“implicits”的用法时,我得到了这样的定义: 我明白这个定义,但它给我带来了以下的疑问。 其他导入语句不也是这样吗?每个import语句都会带来我们希望在代码中使用的函数/选项/方法。如果与常规导入语句不同,那么它们给表带来了什么?它们有何不同?谁能解释一下scala中参数和函数的真正用例吗?

  • 问题内容: 我可以看到有两种不同的导入方式 第二个有括号。那么两者之间有什么区别?什么时候应该加上括号?谢谢 问题答案: 那么,是否应该 在方括号中 导入组件之间的区别在于您的方式。 出口有两种类型 默认导出 命名为出口 组件可以有 一个默认导出,零个或多个命名 导出 如果组件是默认导出,则需要不带括号将其导入,例如 导入为 命名的出口可能像 要么 您可以将其导入为 要么 如果您的组件有一个默认导

  • 我正在使用NextJS与typescript,mongo Atlas,mongoose,node和Express。 当我运行node Pages/Server时,我收到以下错误:我已经上载了我的package.json文件,并且还添加了babel 从“express”导入express;^^^^^^ SyntaxError:不能在模块外部使用导入语句,位于wrapSafe(内部/modules/c

  • 作为在正常情况下使用内置问题的后续,我进行了一些测试,并遇到了令人惊讶的结果。 我在这里比较了传统的< code>import语句和对< code>__import__内置函数的调用的执行时间。为此,我在交互模式下使用以下脚本: 与链接的问题一样,这里是导入以及其他一些标准模块时的比较: 到目前为止,比更快。这对我来说很有意义,因为正如我在链接的帖子中所写的那样,我发现与相比,当后者导致对的调用时

  • 问题内容: 我有一个ApolloServer项目给我带来麻烦,所以我认为我可能会更新它,并且在使用最新的Babel时遇到问题。我的“ index.js”是: 当我运行它时,出现错误“ SyntaxError:无法在模块外部使用import语句”。首先,我尝试做一些事情以说服TPTB *,这是一个模块(没有成功)。因此,我将“导入”更改为“需要”,并且此方法可行。 但是现在我在其他文件中有大约两打“