一、init 函数
1.1 基本介绍
每一个源文件都可以包含一个 init 函数,该函数会在 main 函数执行前,被 Go 运行框架调用,也就是说 init 会在 main 函数前被调用。
1.2 演示
package main
import "fmt"
// init函数,通常可以在init函数中完成初始化工作
func init() {
fmt.Println("Init()")
}
func main() {
// Init()
// Main()
fmt.Println("Main()")
}
复制代码
2.1 init 函数注意事项和细节
2.1.1 执行流程
如果一个文件同时包含全局变量定义,init 函数和 main 函数,则执行的流程是全局变量定义 >> init 函数 >> main 函数
package main
import "fmt"
// 定义全局变量
var age = test()
// 测试全局变量是最先被初始化
func test() int {
fmt.Println("test()")
return 90
}
// init函数,通常可以在init函数中完成初始化工作
func init() {
fmt.Println("Init()")
}
func main() {
// test()
// Init()
// Main()
fmt.Println("Main()")
}
复制代码
2.2 init()作用
主要作用就是完成初始化工作
首先执行被引入文件中的变量定义、init 函数
package main
import (
"fmt"
"go_code/chapter15/initFunc/utils"
)
// 定义全局变量
var age = test()
// 测试全局变量是最先被初始化
func test() int {
fmt.Println("test()")
return 90
}
// init函数,通常可以在init函数中完成初始化工作
func init() {
fmt.Println("Init()")
}
func main() {
// Utils Init()
// test()
// Init()
// Age = 18, Name = Feng
// Main()
fmt.Printf("Age = %v, Name = %v\n", utils.Age, utils.Name)
fmt.Println("Main()")
}
复制代码
二、匿名函数(没有名字的函数)
2.1 匿名函数介绍
Go 支持匿名函数,如果我们某个函数只是希望使用一次,可以考虑使用匿名函数,匿名函数也可以实现多次调用
2.2 匿名函数使用方式
2.2.1 方式 1(使用最多)
将匿名函数赋给一个变量(函数变量),再通过该变量调用该匿名函数(只能调用一次)
package main
import "fmt"
func main() {
// 在定义匿名函数时就直接调用,这种方式的匿名函数只能使用一次
// 使用匿名函数求两数的和
sum := func(n1 int, n2 int) int {
return n1 + n2
}(10, 20)
// Sum = 30
fmt.Printf("Sum = %v", sum)
}
复制代码
2.2.2 方式 2
将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数
package main
import "fmt"
func main() {
// 将匿名函数 func (n1 int, n2 int) int 赋给a变量
// a的数据类型就是函数类型,此时,可以通过a调用
a := func(n1 int, n2 int) int {
return n1 - n2
}
result := a(10, 20)
// result = -10
fmt.Println("result = ", result)
}
复制代码
2.2.3 全局匿名函数
如果将一个匿名函数赋给一个全局变量,那么这个匿名函数就成为一个全局匿名函数,在整个程序中有效
package main
import "fmt"
var (
// Fun1 是一个全局匿名函数,首字母大写
Fun1 = func(n1 int, n2 int) int {
return n1 * n2
}
)
func main() {
// 调用全局匿名函数
result := Fun1(10, 10)
// result = 100
fmt.Println("result = ", result)
}
复制代码
评论