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

Eri*_*del 128 import go

在Go教程中,以及我看过的大多数Go代码,包都是这样导入的:

import (
    "fmt"
    "os"
    "launchpad.net/lpad"
    ...
)
Run Code Online (Sandbox Code Playgroud)

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

import (
    "http"
    . "launchpad.net/gocheck"
    "launchpad.net/lpad"
    "os"    
)
Run Code Online (Sandbox Code Playgroud)

.(期间)有什么意义?

tva*_*son 173

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

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

假设我们编译了一个包含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
Run Code Online (Sandbox Code Playgroud)

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

  • 应该注意的是,Go团队不建议使用点导入.在某些情况下,它可能会导致一些奇怪的行为,并且可能无法无限期地使用该语言. (29认同)
  • @Jimt:代码很大时也很困惑. (2认同)

Eva*_*haw 64

以下是来自Python的类比:

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

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

  • 从公认的答案来看,Python 的 `import os as O` 听起来也相当于 Go 的 `import M "os"`。 (2认同)

Eli*_*vis 6

这应该只用于测试。

这是 golang's wiki 中的一些文档

如果您生成了一些模拟代码,例如使用 mockgen 并导入了您的包代码,然后您的测试包导入了您的包代码,那么您将获得循环依赖(Golang 选择让用户决定如何解决)。

但是,如果在您的测试包中,您在要测试的包上使用点表示法,那么它们将被视为相同的包,并且没有循环依赖!