多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> ### 函数 function * 函数(不支持 嵌套、重载和默认参数, 可以将函数作为一个值进行赋值) ~~~ package main import "fmt" func add(number1 int, number2 int) (number3 int) { number3 = number1 + number2 return } func subtraction(number1, number2 int) int { number3 := number1 - number2 return number3 } func multiplication(number ...int) int { total := 1 for _, v := range number { total *= v } return total } func demo1() { fmt.Println(add(8, 7)) fmt.Println(subtraction(8, 7)) fmt.Println(multiplication(2, 3, 5, 10)) } func main() { demo1() } ~~~ * 匿名函数(通常不希望再次使用(即只使用一次)的函数可以定义为匿名函数) ~~~ package main import "fmt" func demo2() { //f1为函数地址 f1 := func(x, y int) int { z := x + y return z } fmt.Println(f1) fmt.Println(f1(5, 6)) //直接创建匿名函数并运行 f2 := func(x, y int) int { z := x + y return z }(5, 6) fmt.Println(f2) //直接创建匿名函数并运行(无参数的形式) ()调用匿名函数 func() { fmt.Println(5 + 6) }() } func main() { demo2() } ~~~ * 闭包函数 (函数内在包含子函数,并最终return子函数) ~~~ package main import "fmt" func number1(x int) func(y int) int { return func(y int) int { return x + y } } func number2() func() { return func() { fmt.Println("Hello World!") } } func demo3() { n1 := number1(7) fmt.Println(n1(8)) n2 := number2() n2() } func main() { demo3() } ~~~ * 闭包函数2 ~~~ package main import ( "fmt" ) func Number(i int) func() { return func() { fmt.Println(i) } } func main() { number1 := make([]func(), 3) number2 := make([]func(), 3) //TODO:1 //闭包可以直接使用外部的变量 for i := 0; i < 3; i++ { number1[i] = func() { fmt.Println(i) } } fmt.Println("-----TODO1-----") for _, v := range number1 { v() } //TODO:2 for i := 0; i < 3; i++ { j := i number2[i] = func() { fmt.Println(j) } } fmt.Println("-----TODO2-----") for _, v := range number2 { v() } } ~~~ * 递归 ~~~ package main import "fmt" /*栈空间变化(堆栈从左到右,增加到一个峰值后再计算从右到左缩小) demo4(5) 5 + demo4(4) 5 + (4 + demo4(3)) 5 + (4 + (3 + demo4(2))) 5 + (4 + (3 + (2 + demo4(1)))) 5 + (4 + (3 + (2 + 1))) 5 + (4 + (3 + 3)) 5 + (4 + 6) 5 + 10 15 */ func demo4(val int) int { if val > 0 { return val + demo4(val-1) } else { return val } } func main() { fmt.Println(demo4(5)) } ~~~ * 尾递归 ~~~ package main import "fmt" /*栈空间变化 demo5(5, 0) demo5(4, 5) demo5(3, 9) demo5(2, 12) demo5(1, 14) demo5(0, 15) 15 */ func demo5(val int, total int) int { if val > 0 { return demo5(val-1, total+val) } else { return total } } func main() { fmt.Println(demo5(5, 0)) } ~~~ * 迭代 ~~~ package main import "fmt" func demo6(number int) int { total := 0 for { if number > 0 { total += number number-- } else { break } } return total } func main() { fmt.Println(demo6(5)) } ~~~ * 回调函数 ~~~ package main import "fmt" type callback func(val, total int) int func demo7(val int, callback callback) int { if val > 0 { return callback(val, 0) } else { return val } } func addFunc(val int, total int) int { if val > 0 { return addFunc(val-1, total+val) } else { return total } } func main() { fmt.Println(demo7(5, addFunc)) } ~~~ > ### 官方建议官方建议写法(给返回值定义一个名称) ~~~ func Add(num1, num2 int) (num3 int) { num3 = num1 + num2 return } ~~~ > ### 闭包作用域 ~~~ package main import ( "fmt" ) func main() { number := make([]func(), 3) //闭包可以直接使用外部的变量 //输出 333 for i := 0; i < 3; i++ { number[i] = func() { fmt.Println(i) } } //闭包函数的变量,后面调用闭包函数的变量 //全局变量 = 变量的最后一个值 //局部变量 = 当前值 /* 输出 0 1 2 for i := 0; i < 3; i++ { j := i number[i] = func() { fmt.Println(j) } } */ /* 输出 333 j := 3 for i := 0; i < 3; i++ { number[i] = func() { fmt.Println(j) } } */ /* 输出0 1 2 for i := 0; i < 3; i++ { number[i] = Number(i) } */ /* for i := 0; i < 3; i++ { number[i] = func() { fmt.Println(i) } number[i]() } */ for _, v := range number { v() } } func Number(i int) func() { return func() { fmt.Println(i) } } ~~~ > ### 相关阅读 * [闭包函数介绍](http://www.cnblogs.com/leoin2012/p/3978979.html)