【问题标题】:What does the '.' (dot or period) in a Go import statement do?'.' 是什么意思? (点或句点)在 Go 导入语句中做什么?
【发布时间】:2011-09-22 15:58:34
【问题描述】:

在 Go 教程和我看过的大部分 Go 代码中,包是这样导入的:

import (
    "fmt"
    "os"
    "launchpad.net/lpad"
    ...
)

但在http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go 中,gocheck 包是用.(句点)导入的:

import (
    "http"
    . "launchpad.net/gocheck"
    "launchpad.net/lpad"
    "os"    
)

.(句号)有什么意义?

【问题讨论】:

  • 注意,我在问题中添加了点和句点,以便于搜索。

标签: import go


【解决方案1】:

它允许在本地文件块中引用导入包中的标识符而无需限定符。

如果出现显式句点 (.) 而不是名称,则包的所有导出标识符都将在当前文件的文件块中声明,并且无需限定符即可访问。

假设我们编译了一个包含 package 子句 package math 的包,该包导出函数 Sin,并将编译后的包安装在由“lib/math”标识的文件中。此表说明了如何在各种类型的导入声明之后在导入包的文件中访问 Sin。

Import declaration          Local name of Sin

import   "lib/math"         math.Sin
import M "lib/math"         M.Sin
import . "lib/math"         Sin

参考:http://golang.org/doc/go_spec.html#Import_declarations

【讨论】:

  • 需要注意的是,Go 团队不推荐使用点导入。在某些情况下,它可能会导致一些奇怪的行为,并且可能不会无限期地使用该语言。
  • 在某些情况下可能会令人困惑,但我无法忍受使用 go-linq。 github.com/ahmetalpbalkan/go-linq
  • 请注意,您仍然无法访问非导出函数(非大写函数)。所以这种导入方式真的很烂。
  • 在编译程序时使用点导入与不使用点导入。如果编译的文件大小存在巨大差异,是否有原因?使用点导入编译为更大的尺寸。
  • @majidarif:这是一个有趣的观察 :) 您能否使用重现该问题的代码发布一个单独的问题? (我尝试自己做,用import "fmt"import . "fmt" 编译一个简单的hello-world 程序,但在这两种情况下它对我来说都是相同的大小。)
【解决方案2】:

以下是来自 Python 的类比:

  • Go 的 import "os" 大致相当于 Python 的 import os
  • Go 的 import . "os" 大致相当于 Python 的 from os import *

在这两种语言中,通常不赞成使用后者,但这样做可能有充分的理由。

【讨论】:

    【解决方案3】:

    这应该只用于测试。

    Here is some documentation in golang's wiki

    如果您生成了一些模拟代码,例如使用 mockgen 并且它导入了您的包代码,然后您的测试包导入了您的包代码,您会得到一个循环依赖(golang 选择让用户决定如何解决)。

    但是,如果在您的测试包中,您对正在测试的包使用点符号,那么它们将被视为同一个包,并且没有循环依赖!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多