5.1 Go 语言的函数
peter 573 3

函数是一等公民

与其他主要编程语言的差异

  1. 可以有多个返回值

    • 测试实例 1
  2. 所有参数都是值传递:slice、map、channel 会有引用传递的错觉

    Go 语言中所有的参数传递都是值传递。

    为什么slice、map、channel 会有引用传递的错觉?

    答:对于 slice,切片的背后是一个数组,是指向对应的数据结构的指针。通过该指针去操作具体的值时,操作的是同一块空间,给人一种传引用的错觉。

    我觉得这个问题,知道这么一回事就行了,不要去纠结,没必要。

  3. 函数可以作为变量的值

    函数可以作为 map 中的值,见 3.3 测试实例 1

  4. 函数可以作为参数和返回值

    可以很大程度上简化我们的程序,见测试实例 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 函数运行结果:

5.1 Go 语言的函数
评论区

索引目录