• Go基础语法之import原理

    • 如果一个main导入其他包,包将被顺序导入
    • 如果导入的包中依赖其他包(包B),会首先导入B包,然后初始化B包中的常量和变量,最后如果B包中有int,会自动执行init()
    • 所有包导入完成后才会对main中常量和变量进行初始化,然后执行main中的init函数(如果存在),最后执行main函数
    • 如果一个包被导入多次则该包只会被导入一次
  • 一张图去理解上面所描述的规则
  • 代码演示

    • 目录结构

       test
          ├── a1
          │   └── a.go
          ├── b1
          │   └── b.go
          └── main.go

      a1.go文件

      package a1
      
      import "fmt"//引入package包
      
      func init()  {
          fmt.Print("I'm a1.go")//打印
          fmt.Print("\n")
      }
      
      func A1()  {//A1大写可以被外部调用
          
      }

      b1.go文件

           package b1
           
           import (
               "../A1"
               "fmt"
           )
           
           func init()  {
               fmt.Print("I'm b1.go")
               fmt.Print("\n")
           }
           
           func B1()  {//B1大写可以被外部调用
               a1.A1()
           }

      main.go文件

       package main
       
       import (
           "./b1"
           "./a1"
           "fmt"
       )
       
       func main() {
           a1.A1()
           b1.B1()
           fmt.Print("I'm main.go")
       }

      运行main.go文件输出:

         I'm b1.go
         I'm a1.go
         I'm main.go
         Process finished with exit code 0

      由此可以看出如果一个main导入其他包,包将被顺序导入,执行init函数,最后执行main函数,另外我们在b1的B1包函数导入了a1包却没执行两次a1包的init函数,说明包被导入多次则该包只会被导入一次

Last modification:September 18, 2020
如果觉得我的文章对你有用,请随意赞赏