Golang 第五章 5.函数值
在 Go 中,函数也是值(first-class value),可以:
赋值给变量
作为参数传递
作为返回值返回
将函数赋值给变量
func add(x, y int) int {
return x + y
}
var f func(int, int) int = add
fmt.Println(f(2, 3)) // 5f 是一个函数类型的变量
调用方式和函数名一样
函数作为参数
func compute(f func(int,int) int, a, b int) int {
return f(a, b)
}
fmt.Println(compute(add, 3, 4)) // 7可以传递不同函数实现
支持高阶函数
函数作为返回值
func makeAdder(x int) func(int) int {
return func(y int) int {
return x + y
}
}
f := makeAdder(10)
fmt.Println(f(5)) // 15makeAdder 返回一个函数
可以 闭包(closure) 保存外部变量
闭包(Closure)
闭包是 函数值与其引用的环境变量绑定在一起:
func counter() func() int {
i := 0
return func() int {
i++
return i
}
}
c := counter()
fmt.Println(c()) // 1
fmt.Println(c()) // 2
fmt.Println(c()) // 3外部变量 i 被内部匿名函数保存
每次调用,状态累加
闭包是 Go 并发和状态管理常用技巧
匿名函数
可以直接定义函数值而不命名:
f := func(x, y int) int {
return x + y
}
fmt.Println(f(3, 4)) // 7匿名函数常用于立即调用或作为参数传递
示例:函数切片
func main() {
funcs := []func(int) int{
func(x int) int { return x + 1 },
func(x int) int { return x * 2 },
}
for _, f := range funcs {
fmt.Println(f(3))
}
}输出:
4
6可以把多个函数存入切片
动态调用
总结
函数是 值
可以赋值、传参、返回
支持 闭包
匿名函数可以直接定义在表达式中
v2ray节点购买


评论