Skip to content

函数值 ​

在 Go 里,函数是第一类对象:能赋给变量、能当参数传、能当返回值返回,高阶函数、回调都建立在这上面。

函数值 ​

函数值就是函数本身的值,赋给变量之后和普通函数一样调用。

定义和使用函数值 ​

函数值有三种去向:赋给变量后直接调用;当参数传进另一个函数,让调用方决定做什么;当返回值从函数里抛出来,调用方拿到一段可执行的逻辑。下面的示例依次对应这三种。

示例:基本用法 ​

定义函数值 ​

go
package main

import "fmt"

// 定义一个函数
func add(a int, b int) int {
    return a + b
}

func main() {
    // 将函数赋值给变量
    var addFunc func(int, int) int
    addFunc = add

    // 调用函数值
    result := addFunc(3, 4)
    fmt.Println("Result:", result) // 输出:Result: 7
}

函数值作为参数 ​

go
package main

import "fmt"

// 定义函数类型
type IntOperation func(int, int) int

// 函数接收函数值作为参数
func compute(a int, b int, op IntOperation) int {
    return op(a, b)
}

func add(a int, b int) int {
    return a + b
}

func multiply(a int, b int) int {
    return a * b
}

func main() {
    fmt.Println("Add:", compute(3, 4, add))        // 输出:Add: 7
    fmt.Println("Multiply:", compute(3, 4, multiply)) // 输出:Multiply: 12
}

函数值作为返回值 ​

go
package main

import "fmt"

// 返回一个函数值
func getOperation(op string) func(int, int) int {
    switch op {
    case "add":
        return func(a int, b int) int { return a + b }
    case "multiply":
        return func(a int, b int) int { return a * b }
    default:
        return nil
    }
}

func main() {
    addOp := getOperation("add")
    multiplyOp := getOperation("multiply")

    if addOp != nil {
        fmt.Println("Add:", addOp(3, 4)) // 输出:Add: 7
    }
    if multiplyOp != nil {
        fmt.Println("Multiply:", multiplyOp(3, 4)) // 输出:Multiply: 12
    }
}

高阶函数 ​

接受函数参数、或返回函数的函数叫高阶函数。createMultiplier 就是:调一次,拿到一个绑定了 factor 的新函数。

示例:高阶函数 ​

go
package main

import "fmt"

// 定义高阶函数
func createMultiplier(factor int) func(int) int {
    return func(value int) int {
        return value * factor
    }
}

func main() {
    // 创建一个乘以 2 的函数
    double := createMultiplier(2)
    // 创建一个乘以 10 的函数
    tenTimes := createMultiplier(10)

    fmt.Println("Double 3:", double(3))     // 输出:Double 3: 6
    fmt.Println("Ten times 3:", tenTimes(3)) // 输出:Ten times 3: 30
}

总结 ​

函数值的三种去向,三个例子各占一个:addFunc = add 赋给变量,compute(3, 4, add) 当参数传,getOperation("add") 当返回值抛。函数类型可以自己声明,IntOperation 就是 func(int, int) int 起的别名,专用来当参数类型。

参考资料 ​

同层页面 ​

相关页面 ​

Hello Golang