函数是一等公民
与其他主要编程语言的差异
可以有多个返回值
- 测试实例 1
所有参数都是值传递:slice、map、channel 会有引用传递的错觉
Go 语言中所有的参数传递都是值传递。
为什么slice、map、channel 会有引用传递的错觉?
答:对于 slice,切片的背后是一个数组,是指向对应的数据结构的指针。通过该指针去操作具体的值时,操作的是同一块空间,给人一种传引用的错觉。
我觉得这个问题,知道这么一回事就行了,不要去纠结,没必要。
函数可以作为变量的值
函数可以作为 map 中的值,见 3.3 测试实例 1
函数可以作为参数和返回值
可以很大程度上简化我们的程序,见测试实例 2
测试实例 1
func returnMultiValues() (int, int) {
return rand.Intn(10), rand.Intn(20)
}
func TestFn(t *testing.T) {
a, b := returnMultiValues()
t.Log(a, b) // 1 7
}
注意: 在 Go 语言中,rand.Intn()
是伪随机的,因此上述代码运行多少次返回的都是 1 7
测试实例 2
通过函数式编程的方式,写一个代码运行计时器:
// functional programming 参数是一个函数,返回的也是一个函数
func timeSpend(inner func(op int) int) func(op int) int {
return func(n int) int {
start := time.Now()
ret := inner(n)
fmt.Println("time spend:", time.Since(start).Seconds())
return ret
}
}
func slowFun(op int) int {
time.Sleep(time.Second * 1)
return op
}
func TestFn(t *testing.T) {
tsSF := timeSpend(slowFun)
t.Log(tsSF(10))
}
TestFn
函数运行结果: