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()
}

运行代码:
image.png
报错提示导入了未使用的包,可见Go编译器十分严格,当没有使用包中的接口方法时不允许导入该包。

因此这个时候想要不调用包的接口情况下又想使用包的init函数就要使用import匿名导包

匿名导包语法

在导入的包前添加_匿名符,这样就可以表示虽然不使用这个包,但是可以正常导入

package main

import (
    _ "GoStudy/5-init/lib1"
    "GoStudy/5-init/lib2"
)

func main() {
    //lib1.Lib1Test()
    lib2.Lib2Test()
}

运行:
image.png
可以看到在没有调用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

运行结果:
image.png

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行直接调用方法名,不需要在前面加上包的名称

运行结果:
image.png
成功调用方法。

缺点

当多个包都使用.导入时,有可能两个包中的方法名是相同的,那这个时候直接调用函数名可能会发生歧义,所以不推荐。

总结

  • import _ "fmt"

    • 给fmt包起一个别名,表示匿名,无法使用当前报的方法,但是会执行当前的包内部的init()方法
  • import abc "fmt"

    • 给fmt起一个别名,名称为abc,abc.Println()来调用包中的方法
  • import . "fmt"

    • 将当前fmt包中的全部方法导入到当前本包的作用域中,fmt包中的方法可以直接调用方法名来调用而不需要fmt.方法名来调用(不推荐,可能有重名方法)。
最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏