写点什么

【一 Go 到底】第十九天 ---init 函数、匿名函数

作者:指剑
  • 2022-10-19
    重庆
  • 本文字数:1275 字

    阅读完需:约 1 分钟

【一Go到底】第十九天---init函数、匿名函数

一、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)}
复制代码


发布于: 刚刚阅读数: 3
用户头像

指剑

关注

InfoQ签约作者 2022-07-13 加入

AWS Community Builder,AWS Student Ambassador,阿里云专家博主,OPS社区创始成员

评论

发布
暂无评论
【一Go到底】第十九天---init函数、匿名函数_Go_指剑_InfoQ写作社区