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.