Golang 第五章 5.函数值

  • By v2ray节点

  • 2026-03-26 16:46:11

  • 评论

在 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)) // 5

f 是一个函数类型的变量

调用方式和函数名一样



函数作为参数

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)) // 15

makeAdder 返回一个函数

可以 闭包(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节点购买