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",)
}
posted @ 2021-04-20 15:39  ty1539  阅读(483)  评论(0编辑  收藏  举报