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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2021-02-27 13:37  GPHPER  阅读(86)  评论(0编辑  收藏  举报
TOP