3 - 函数
2020-07-02 本文已影响0人
天命_风流
- 函数可以返回多个返回值
- 函数的值都是值传递
package fn
import (
"math/rand"
"testing"
)
func returnMultValues() (int, int){
return rand.Intn(10), rand.Intn(20)
}
func TestFn(t *testing.T){
a, b := returnMultValues()
t.Log(a, b)
}
- 函数可以作为变量的值
- 函数可以作为参数和返回值
- 通过上面的这个性质,你可以构造一个类似 Python 中装饰器的东西
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
}
}
func slowFun(op int) int{
time.Sleep(time.Second * 1)
return op
}
func TestTimeSpent(t *testing.T){
tsSlowFun := timeSpent(slowFun)
t.Log(tsSlowFun(666))
}
- 函数的参数长度是可变的,使用 ...
func Sum(ops ...int) int{
fmt.Println(reflect.TypeOf(ops)) // []int
sum := 0
for _, op := range ops{
sum += op
}
return sum
}
func TestVar(t *testing.T){
t.Log(Sum(1,2,3))
t.Log(Sum(1,2,3,4,5))
}
- 延迟函数:在函数执行结束之后执行的函数,相当于 finally
- 延迟函数可以和 recover 进行错误恢复
- 延迟函数可以做资源释放
func Clear(){
fmt.Println("Clear resources.")
}
func TestDefer(t *testing.T){
defer Clear()
fmt.Println("Start")
panic("Error")
}
// Start -> Clear resources. -> panic: Error