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

.(周期)的意义是什么?

33333 次浏览

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

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

假设我们已经编译了一个包含包子句包数学(它导出函数 Sin)的包,并将编译后的包安装在由“ lib/數学”标识的文件中。下表说明了在各种类型的导入声明之后,如何在导入包的文件中访问 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

这里有一个来自 Python 的类比:

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

在这两种语言中,使用后者通常是不被允许的,但是这样做有很好的理由。

这应该只在测试中使用。

这里有一些 Golang 的 wiki 中的文档

如果您已经生成了一些模拟代码,比如使用 modgen,并且它导入了您的包代码,然后您的测试包 还有导入了您的包代码,那么您将得到一个循环依赖项(一些 golang 选择让用户决定如何解析)。

但是,如果在您的测试包中,您使用点符号的包,您正在测试,然后他们被视为同一个包,并没有循环依赖!