什么是'。' Go导入语句中的(点或句点)吗?

时间:2011-06-25 16:16:37

标签: import go

在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"    
)

.(期间)的重要性是什么?

3 个答案:

答案 0 :(得分:166)

它允许在没有限定符的情况下在本地文件块中引用导入包中的标识符。

  

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

     

假设我们编译了一个包含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

答案 1 :(得分:60)

以下是来自Python的类比:

  • Go {'1}}大致相当于Python import "os"
  • Go {'1}}大致相当于Python import os

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

答案 2 :(得分:2)

这只能用于测试。

Here is some documentation in golang's wiki

如果您已经生成了诸如模拟程序之类的模拟代码,并且该模拟代码导入了您的程序包代码,然后您的测试程序包也导入了您的程序包代码,您将得到一个循环依赖项(golang选择让用户决定如何解决。)

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