golang学习笔记——函数


不定参数类型函数定义 【args ...type package main   import "fmt"   func Func01(a byte, args ...int) {    fmt.Printf("len(arg) is %d\n", len(args))    fmt.Printf("a is %c", a) }   func main() {    Func01('c', 13, 34, 45) } //********输出********* len(arg) is 3 a is c 定义函数类型 package main   import "fmt"   func Add(a, b int) int {    return a + b }   //定义函数类型 type FuncType func(int, int) int   func main() {    var fTest FuncType    fTest = Add    a := fTest(10, 20)    fmt.Print(a) } //********输出********* 30 回调函数 package main   import "fmt"   func Add(a, b int) int {     return a + b }   func Subtr(a, b int) int {     return a - b }   type FuncType func(int, int) int   func Calculator(a int, b int, funx FuncType) {     fmt.Printf("a is %d,b is %d \n", a, b)     result := funx(a, b)     fmt.Printf("result is %d \n", result) }   func main() {     Calculator(10, 20, Add)     Calculator(20, 10, Subtr) } //******输出********* a is 10,b is 20 result is 30 a is 20,b is 10 result is 10 匿名函数 package main   import "fmt"   func main() {     a := 10     s := "hello"     //定义匿名函数     f1 := func(i, j int) (result int) {          fmt.Printf("a is %d,s is %s", a, s)          result = i + j          return     }       result := f1(10, 20)     fmt.Printf("result is %d \n", result)       //定义匿名函数并直接调用     sum := func(n, m int) (sum int) {          sum = n + m          return     }(10, 40)     fmt.Printf("sum is %d \n", sum) } 理解闭包函数的使用 package main   import "fmt"   func Test() func() int {     var x int     return func() int {          x++          return x     } }     func Test2() int {     var x int     x++     return x }   func main() {     f1 := Test()   //这里f1实际指向的是 func() int{} 函数     fmt.Println(f1()) // 1     fmt.Println(f1()) // 2     fmt.Println(f1()) // 3       f2 := Test2     // f2指向 Test2() int{} 函数     fmt.Println(f2()) // 1     fmt.Println(f2()) // 1     fmt.Println(f2()) // 1 } defer 延时调用(在函数中return之后执行) package main   import "fmt"   func main() {     defer fmt.Println("hello")     fmt.Println("world") //先输出 world 后输出 hello }
  • defer被声明时,参数是实时解析
package main   import "fmt"   func main() {     a := 10     b := 20       defer func(a, b int) {          fmt.Printf("a = %d,b = %d \n", a, b)     }(a, b)       a = 100     b = 200     fmt.Printf("a = %d,b = %d \n", a, b)     // a = 100,b = 200     // a = 10,b = 20 }
  • defer执行顺序,先进后出
package main   import "fmt"   func main(){    defer fmt.Println("aaaaaa")    defer fmt.Println("bbbbbb")    defer fmt.Println("cccccc")    //先显示 cccccc 再显示 bbbbbb  最后显示 aaaaaa }
  • defer可以获取有名返回值
package main   import "fmt"   func c() (i int) {    defer func() {       i++    }()    return 1 }   func main() {    fmt.Println(c()) //输出 2 } //*****分析******** 先执行c()函数里面的 return 1 由于定义c函数时定义了返回值的变量名为i,所以这时的i等于1 defer 函数在return之后执行,也就是在 i=1 被赋值之后执行defer的函数,所以结果为 2 package main   import "fmt"   func main() {    fmt.Println(test()) //输出 2    fmt.Println(test1()) //输出 5 }   func test() (result int) {    defer func() {       result++    }()    return 1 }   func test1() (result int) {    t := 5    defer func() {       t = t + 5    }()    return t } //*******分析************ test1() 返回 5 是因为函数定义的返回变量是 result 而 defer 函数中使用的变量是 t 而不是 result