学习golang(day 5)- 复杂函数、闭包、defer、init 2022-05-19 22:23:00 编程 golang 暂无评论 274 次阅读 1995字 修改时间:2022-05-19 23:00:01 #复杂函数 上回说到,函数可以作为参数传递,函数也可以作为返回值,今天就来体验一下 **参数为函数** ```go func main() { test("张三", sayHello) } func sayHello(name string) { fmt.Println(name) } // 参数作为函数 func test(name string, f func(string)) { f(name) } ``` **返回值为函数** ```go func main() { f1 := cal("+")(1, 2) fmt.Println(f1) f2 := cal("-")(2, 1) fmt.Println(f2) } func add(a int, b int) int { return a + b } func sub(a int, b int) int { return a - b } func cal(oprator string) func(int, int) int { switch oprator { case "+": return add case "-": return sub default: return nil } } ``` ------------ #匿名函数 ```go func main() { result := func(a int, b int) int { return a + b }(1, 2) // 后面加括号代表直接调用,等价于 result(1,2) fmt.Println(result) } ``` ------------ #闭包 简单来说,闭包就是在函数内部的函数,闭包 = 函数 + 引用环境 ```go func main() { // 变量f接收了一个函数,是一个闭包,f在变量 f 的生命周期内,变量 x 也一直有效 f := add() fmt.Println(f(10)) fmt.Println(f(20)) fmt.Println(f(30)) fmt.Println("-----------") f1 := add() fmt.Println(f1(1)) fmt.Println(f1(2)) fmt.Println(f1(3)) } // 返回一个函数 func add() func(int) int { var x int return func(y int) int { x += y return x } } ``` 运行结果 ```go 10 30 60 ----------- 1 3 6 ``` ------------ #defer 类似finally,最后执行 **defer特征** - defer 注册延迟调用 - 先 defer 的语句最后执行 ```go func main() { fmt.Println("start") defer fmt.Println("1") defer fmt.Println("2") defer fmt.Println("3") fmt.Println("end") // 执行结果 // start // end // 3 // 2 // 1 } ``` ------------ #init 函数 **特征** - init函数在main函数前自动执行,不能被别的方法调用 - init函数没有参数,没有返回值 - 每个包可以有多个init函数 ```go // 加载顺序,变量初始化 => init => main var i = initVar() func init() { fmt.Println("init...") } func initVar() int { fmt.Println("initVar...") return 100 } func main() { fmt.Println("main...") } ``` 运行结果 ```go initVar... init... main... ``` ------------ 标签: golang
评论已关闭