【Duke】Go语言的函数 011 - PingPongGooo/GoFoundation GitHub Wiki

函数 一等 公民

函数是一等公民

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

1. 可以有多个返回值
2. 所有参数都是值传递:slice,map, channel 会有传引用的感觉
3. 函数可以作为变量的值
4. 函数可以作为参数和返回值

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

package _func

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

func returnMultiValues()(int, int){
	return rand.Intn(10), rand.Intn(20)
}
func TestFn(t *testing.T)  {
	//a,b := returnMultiValues()
	//t.Log(a,b)
	//
	//c,_:= returnMultiValues()
	//t.Log(c)
	//
	//d,_:= returnMultiValues()
	//t.Log(d)

	tsSF := timeSpent(slowFun)
	t.Log(tsSF(10))

}

// 有点像装饰器模式
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
}

学习函数式编程

图书推荐 《计算机程序的构造与解释》 在 MIT 大概使用了 30-40年 的 一本你计算机教程。