Go基础语法之import原理(六)

2022-09-11 13:26:49 浏览数 (1)

Go基础语法之import原理

如果一个main导入其他包,包将被顺序导入 如果导入的包中依赖其他包(包B),会首先导入B包,然后初始化B包中的常量和变量,最后如果B包中有int,会自动执行init() 所有包导入完成后才会对main中常量和变量进行初始化,然后执行main中的init函数(如果存在),最后执行main函数 如果一个包被导入多次则该包只会被导入一次

一张图去理解上面所描述的规则

代码演示

目录结构

代码语言:javascript复制
 test
    ├── a1
    │   └── a.go
    ├── b1
    │   └── b.go
    └── main.go

a1.go文件

代码语言:javascript复制
package a1

import "fmt"//引入package包

func init()  {
    fmt.Print("I'm a1.go")//打印
    fmt.Print("n")
}

func A1()  {//A1大写可以被外部调用
    
}

b1.go文件

代码语言:javascript复制
     package b1
     
     import (
         "../A1"
         "fmt"
     )
     
     func init()  {
         fmt.Print("I'm b1.go")
         fmt.Print("n")
     }
     
     func B1()  {//B1大写可以被外部调用
         a1.A1()
     }

main.go文件

代码语言:javascript复制
 package main
 
 import (
     "./b1"
     "./a1"
     "fmt"
 )
 
 func main() {
     a1.A1()
     b1.B1()
     fmt.Print("I'm main.go")
 }

运行main.go文件输出:

代码语言:javascript复制
   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函数,说明包被导入多次则该包只会被导入一次

0 人点赞