函数值-学习Go语言
目录
阅读笔记
functions-values.go
package main
import (
"fmt"
"math"
)
func compute(fn func(float64, float64) float64) float64 {
return fn(3, 4)
}
func main() {
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(5, 12))
fmt.Println(compute(hypot))
fmt.Println(compute(math.Pow))
}
笔记
函数也是值。它们可以像其它值一样传递。 函数值可以用作函数的参数或返回值。 \1. 函数可以传值进去 \2. 5 12 的平方根 = 13 \3. (fn func(float64, float64) float64) 包含起来会好理解些,可以认为是一个申明。
functions-closures.go
package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}
笔记
- Go 函数可以是一个闭包。闭包是一个函数值,它引用了其函数体之外的变量。该函数可以访问并赋予其引用的变量的值,换句话说,该函数被“绑定”在了这些变量上。
- 可以想一想JavaScirpt的闭包概念,和Go的闭包是不是有一些类似?