
点导入(dot import)
当在import语句中使用点(.)时,例如:
import . "launchpad.net/gocheck"
这会将launchpad.net/gocheck包中所有导出的标识符(例如函数、变量、常量等)直接声明到当前文件的文件块中。这意味着,你可以直接使用这些标识符,而无需使用包名作为前缀。
示例
假设launchpad.net/gocheck包中定义了一个名为Assert的函数。在不使用点导入的情况下,我们需要这样调用它:
立即学习“go语言免费学习笔记(深入)”;
import "launchpad.net/gocheck"
func main() {
gocheck.Assert(1, Equals, 1) // 假设Equals也是gocheck包导出的
}但是,如果使用点导入:
import . "launchpad.net/gocheck"
func main() {
Assert(1, Equals, 1)
}可以看到,Assert函数可以直接被调用,无需使用gocheck.前缀。
不同导入方式的对比
| 导入声明 | Sin 的本地名称 |
|---|---|
| import "lib/math" | math.Sin |
| import M "lib/math" | M.Sin |
| import . "lib/math" | Sin |
注意事项
虽然点导入可以简化代码,但它也存在一些潜在的风险:
- 命名冲突: 如果导入的包中存在与当前文件中已有的标识符同名的标识符,就会发生命名冲突。编译器会报错,导致代码无法编译。
- 可读性降低: 过度使用点导入会降低代码的可读性,因为很难确定某个标识符来自哪个包。
最佳实践
一般来说,应该避免过度使用点导入。只有在以下情况下,才考虑使用点导入:
- 测试代码: 在编写测试代码时,可以使用点导入来简化测试代码,提高可读性。例如,在使用gocheck等测试框架时,点导入可以减少冗余的代码。
- 内部包: 对于一些内部使用的包,如果确定不会发生命名冲突,可以使用点导入。
总结
import语句中的点(.)是一种特殊的导入方式,它可以将导入包的导出标识符直接声明到当前文件的文件块中。虽然它可以简化代码,但也存在命名冲突和可读性降低的风险。因此,应该谨慎使用点导入,只在必要的情况下使用,并避免过度使用。在大多数情况下,使用标准的包名限定符来访问导入包的标识符是更好的选择。










