import匿名导包
上一篇介绍了使用import导入lib1和lib2模块, 并且在main函数中调用了两个包的api,但是假如现在极端环境下需要在main函数中不调用lib1的接口方法,只想使用lib1的init函数初始化,代码如下:
package main
import (
"GoStudy/5-init/lib1"
"GoStudy/5-init/lib2"
)
func main() {
//lib1.Lib1Test()
lib2.Lib2Test()
}
运行代码:
报错提示导入了未使用的包,可见Go编译器十分严格,当没有使用包中的接口方法时不允许导入该包。
因此这个时候想要不调用包的接口情况下又想使用包的init函数就要使用import匿名导包。
匿名导包语法
在导入的包前添加_
匿名符,这样就可以表示虽然不使用这个包,但是可以正常导入
package main
import (
_ "GoStudy/5-init/lib1"
"GoStudy/5-init/lib2"
)
func main() {
//lib1.Lib1Test()
lib2.Lib2Test()
}
运行:
可以看到在没有调用lib1包的接口情况下,运行了lib1包的init函数
import别名导包
可以给导入的包定义一个别名,类似于python的import ... as ... from ...
例如:
package main
import (
_ "GoStudy/5-init/lib1"
mylib2 "GoStudy/5-init/lib2"
)
func main() {
//lib1.Lib1Test()
//lib2.Lib2Test()
mylib2.Lib2Test()
}
- 第5行给lib2定义了一个别名叫
mylib2
运行结果:
import将包全部导入当前包(不推荐)
可以使用.
别名,表示将包的所有方法全部导入当前包,这样在调用导入包的方法时,可以直接调用函数名即可。
案例:
package main
import (
_ "GoStudy/5-init/lib1"
//mylib2 "GoStudy/5-init/lib2"
. "GoStudy/5-init/lib2"
)
func main() {
//lib1.Lib1Test()
//lib2.Lib2Test()
//mylib2.Lib2Test()
Lib2Test()
}
- 第6行将导入的包使用
.
作为别名,代表将所有方法都导入当前包中可以直接调用 - 第14行直接调用方法名,不需要在前面加上包的名称
运行结果:
成功调用方法。
缺点
当多个包都使用.
导入时,有可能两个包中的方法名是相同的,那这个时候直接调用函数名可能会发生歧义,所以不推荐。
总结
import _ "fmt"
- 给fmt包起一个别名,表示匿名,无法使用当前报的方法,但是会执行当前的包内部的init()方法
import abc "fmt"
- 给fmt起一个别名,名称为abc,abc.Println()来调用包中的方法
import . "fmt"
- 将当前fmt包中的全部方法导入到当前本包的作用域中,fmt包中的方法可以直接调用方法名来调用而不需要fmt.方法名来调用(不推荐,可能有重名方法)。
此处评论已关闭