13丨Go 语言的函数 & 14丨可变参数和 defer

函数:一等公民

函数是⼀等公民

与其他主要编程语言的差异
1. 可以有多个返回值
2. 所有参数都是值传递:slice,map,channel 会有传引⽤的错觉
3. 函数可以作为变量的值
4. 函数可以作为参数和返回值

函数:可变参数及 defer

可变参数

func sum(ops ...int) int {
 s := 0
 for _, op := range ops {
 s += op
 }
 return s
}

 

defer函数

func TestDefer(t *testing.T) {
   defer func() {
    t.Log("Clear resources")
  }()
  t.Log("Started")
  panic("Fatal error”) //defer仍会执⾏
}

 

测试代码

package ch10

import (
    "fmt"
    "math/rand"
    "testing"
    "time"
)

func returnMutiVlues() (int, int) {
    return rand.Intn(10), rand.Intn(20)
}

//装饰器函数
func timeSpent(inner func(op int) int) func(op int) int {
    return func(n int) int {
        start := time.Now()
        ret := inner(n)
        fmt.Println("time spent:", time.Since(start).Seconds())
        return ret * ret
    }
}

func slowFun(op int) int {
    time.Sleep(time.Second * 1)
    return op
}

func TestFn(t *testing.T) {
    a, _ := returnMutiVlues()
    t.Log(a)
    tsSF := timeSpent(slowFun) // 传入一个函数 ,对反回一个被装饰过的函数
    t.Log(tsSF(10))

}

func Sum(ops ...int) int {
    ret := 0
    for _, op := range ops {
        ret += op
    }
    return ret
}
func TestVarParam(t *testing.T) {
    t.Log(Sum(1, 2, 3, 4))      //10
    t.Log(Sum(1, 2, 3, 4, 5, )) //15
}

func Clear() {
    fmt.Println("Clear resource.")
}

func TestDefer(t *testing.T) {
    defer Clear() // 最后执行
    fmt.Println("Start")
    panic("err") //在panic后面的代码不能执行
}

//Start
//Clear resource.

 

posted @ 2021-01-22 00:17  元贞  阅读(71)  评论(0编辑  收藏  举报