init函数和匿名函数
init函数:
基本介绍:
每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init会在main函数前被调用。
案例说明:
//init函数,通常可以在init函数中完成初始化工作
func init() {
fmt.Println("init()...")
}
func main() {
fmt.Println("main()...")
}
输出结果:
细节讨论:
1)如果一个文件同时包含全局变量定义,init函数和main函数,则执行的流程是变量定义->init函数->main函数
例子:
package main
import (
"fmt"
)
var age int = test()
//为了看到全局变量是先被初始化的,我们这里先写一个函数来完成初始化
func test() int {
fmt.Println("test()") //1
return 90
}
//init函数,通常可以在init函数中完成初始化工作
func init() {
fmt.Println("init()...") //2
}
func main() {
fmt.Println("main()... age = ", age) //3
}
2)init函数最主要的作用,就是完成一些初始化的工作。
例子:
package utils
import "fmt"
var Age int
var Name string
//Age 和 Name 全局变量,我们需要在main.go 使用
//但是我们需要初始化Age 和 Name
//init 函数完成初始化工作
func init() {
fmt.Println("utils 包的 init()...")
Age = 100
Name = "tom~"
}
package main
import (
"fmt"
"chapter04/demo7/utils"
)
func init() {
fmt.Println("main 包的init()...")
}
func main() {
fmt.Println("Age = ", utils.Age, "Name = ", utils.Name)
}
结果是:
细节讨论:
3) 面试题:案例如果是main.go 和 utils.go 都含有变量定义,init函数时,执行的流程又是怎么样的呢?
也就是先执行加载的文件里的变量定义和init函数。
匿名函数:
介绍:
Go支持匿名函数,如果我们某个函数只是希望使用一次,可以考虑使用匿名函数,匿名函数也可以实现多次调用
匿名函数使用方式1:
在定义匿名函数时就直接调用
案例:
func main() {
//案例演示,求两个数的和,使用匿名函数的方式完成
res1 := func (n1 int, n2 int) int {
return n1 + n2
}(10, 20) //参数值写在这里
fmt.Println("res1 = ", res1)
}
匿名函数使用方式2:
将匿名函数赋给一个变量(函数变量),在通过该变量来调用匿名函数
案例:
func main() {
//将匿名函数func (n1 int, n2 int) int 赋给了 a变量
//则a 的数据类型就是函数类型,此时我们可以通过a完成调用。
a := func (n1 int, n2 int) int {
return n1 - n2
}
res2 := a(10, 30)
fmt.Println("res2 = ", res2)
res3 := a(90, 30)
fmt.Println("res3 = ", res3)
}
全局匿名函数:
如果将匿名函数赋给一个全局变量,那么这个匿名函数,就成为一个全局匿名函数,可在程序有效。
例子:
var (
//fun1 就是一个全局匿名函数
fun1 = func (n1 int, n2 int) int {
return n1 * n2
}
)
func main() {
//全局匿名函数的使用
res4 := fun1(4, 9)
fmt.Println("res4 = ", res4)
}
最新文章
- Blink, 通向哈里·;波特的魔法世界
- Winform 导入导出方法
- AngularJs form.FormController、ngModel.NgModelController
- 打包文件 MANIFEST.MF 功能详解
- bootstrap弹出提示窗口功能
- 如何使CSS3中的animation动画当每滑到一屏时每次都运行
- Nginx学习笔记(六) 源码分析&;启动过程
- C++内嵌汇编代码,简单文件加密
- 流媒体学习三-------SIP消息结构详解
- 【C#学习笔记】调用C++生成的DLL
- flex数据交互方式 转
- 0xc000000f: Error attempting to read the boot configuration data
- 麻瓜之我要学sql,啦啦啦啦
- 关于 JavaScript 中的继承
- topcoder srm 702 div1 -3
- C#窗体布局技巧
- 【转】每天一个linux命令(19):find 命令概览
- 【Cf #503 C】Sergey's problem(有趣的构造)
- php输出日志的实现
- Tomcat性能监控