funcadder()func(int)int { sum := 0 returnfunc(v int)int { sum += v return sum } }
funcmain() { a := adder() for i:=0; i<10; i++ { fmt.Printf("0 + 1 + ... + %d = %d\n", i, a(i)) } }
闭包与Python类似,里面有函数体,函数体里有局部变量和自由变量(e.g.,
sum)。
对应的Python闭包方式
1 2 3 4 5 6 7 8 9
defadder(): sum = 0
deff(value): nonlocalsum sum += value returnsum
return f
其中nonlocal就是标准,表示该变量不是局部变量
缺点
但是 Go
中的函数式编程因为不像Python一样不用限制类型(泛型的缺失,duck
typing),就会导致后续代码会很难维护
比如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
funcmain() { var list = []string{"Orange", "Apple", "Banana", "Grape"} // we are passing the array and a function as arguments to mapForEach method. var out = mapForEach(list, func(it string)int { returnlen(it) }) fmt.Println(out) // [6, 5, 6, 5] }
// The higher-order-function takes an array and a function as arguments funcmapForEach(arr []string, fn func(it string)int) []int { var newArray = []int{} for _, it := range arr { // We are executing the method passed newArray = append(newArray, fn(it)) } return newArray }
如果想包装一下,给别人用,那就得用泛型了,不然别人要是想用map[int],那不就得开发一个
1 2 3 4 5 6 7 8
funcmapInt64ForEach(arr []int64, fn func(it int64)int) []int { var newArray = []int{} for _, it := range arr { // We are executing the method passed newArray = append(newArray, fn(it)) } return newArray }