init())函数和main()函数
init()函数和main()函数
1.这两个函数都是go语言中的保留函数。init()用于初始化信息,main()用于作为程序的入口
2.这两个函数定义的时候:不能有参数,返回值。只能由go程序白动调用,不能被引用。
3.init()函数可以定义在任意的包中,可以有多个。main()函数只能在main包下,并且只能有一个.
4.执行顺序
A:先执行init(0函),后执行main()函致
B:对于同一个go文件中,调用顺序是从上到下的,也就是说,先写的先被执行,后写的后被执行
C:对于同一个包下,将文件名按照字符串进行排序,之后顺序调用各个文件中init()函政
D:对于不同包下,
如果不存在依赖,按照main包中import的顺序来调用对应包中init()函数
如果存在依籁,最后被依赖的最先被初始化
导入顺序: main>A>B>C 执行顺序:C>B>A>main
5.存在依算的包之间,不能循环导入
6.—个包可以彀其他多个包import,但是只能狻初始化一次。
代码实例目录结构如下:
calc_test在goland中要以package MyProject\pingguoxueyuan\gostudy\listen11\calc_test运行,或者build之后才能运行
它验证了init执行顺序问题和全局变量修改问题
MyProject/pingguoxueyuan/gostudy/listen11/calc_test/main.go
点击查看代码
package main
import (
"MyProject/pingguoxueyuan/gostudy/listen11/calc"
//_ "MyProject/pingguoxueyuan/gostudy/listen11/calc_test"
"fmt"
)
func main(){
sum = calc.Add(3,5)
fmt.Printf("sum=%d\n",sum)
}
func init(){
fmt.Println("init func in main.go 002",a,b)
fmt.Printf("init func in main.go 002 &a=%p &b=%p\n",&a,&b)
}
func init(){
a = 11
b = 12
fmt.Println("init func in main.go 003",a,b)
fmt.Printf("init func in main.go 003 &a=%p &b=%p\n",&a,&b)
}
var a int = 10
var b int = 20
MyProject/pingguoxueyuan/gostudy/listen11/calc_test/test.go
点击查看代码
package main
import "fmt"
var (
sum int
)
func init(){
fmt.Println("打死了富家大室",a,b)
fmt.Printf("init3 func in main.go &a=%p &b=%p\n",&a,&b)
fmt.Println("init3 func in main.go")
}
MyProject/pingguoxueyuan/gostudy/listen11/calc/calc.go
点击查看代码
package calc
import "fmt"
var (
Sum int
)
func Add(a int, b int)int{
return a + b
}
func init(){
fmt.Println("MyProject/pingguoxueyuan/gostudy/listen11/calc/calc.go>>>>001",)
}
写入自己的博客中才能记得长久