首页 > 编程笔记 > Go语言笔记 阅读:10

Go语言函数变量(将函数保存在变量中)

在 Go 语言中,函数也是一种类型,可以像其他数据类型一样将函数保存在变量中。代码如下:
package main

import "fmt"

func sum(m int, n int) int { // 定义 sum() 函数 // 返回两个参数的和
    return m + n
}

func main() {
    var add func(int, int) int // 定义函数变量
    add = sum // 将函数作为 add 变量的值
    fmt.Print(add(5, 7)) // 调用函数
}
运行结果为:

12

上述代码定义了包含两个参数的函数 sum(),返回值为 int 类型。在主函数中定义函数变量 add,数据类型是函数类型 func(),将定义的函数名 sum 赋值给函数变量 add,在变量 add 后加上小括号并传递两个实参,相当于调用 sum() 函数。

注意,如果在定义函数时设置了参数和返回值,那么在定义函数变量时,用于声明函数类型的 func 关键字后面也需要加上函数的参数列表和返回类型列表。

【实例】切片排序。使用函数变量的形式实现切片排序功能,根据指定的排序规则实现对应的排序。代码如下:
package main

import "fmt"

func AscSlice(num []int) { // 定义 AscSlice() 函数
    // 对切片元素升序排列
    for i := 0; i < len(num)-1; i++ {
        for j := i + 1; j < len(num); j++ {
            if num[i] < num[j] {
                num[i], num[j] = num[j], num[i]
            }
        }
    }
}

func DescSlice(num []int) { // 定义 DescSlice() 函数
    // 对切片元素降序排列
    for i := 0; i < len(num)-1; i++ {
        for j := i + 1; j < len(num); j++ {
            if num[i] > num[j] {
                num[i], num[j] = num[j], num[i]
            }
        }
    }
}

func SortSlice(num []int, sort func(num []int)) { // 定义 SortSlice() 函数
    sort(num) // 调用函数
    fmt.Println(num) // 输出排序结果
}

func main() {
    var nums = []int{5, 9, 7, 3, 2, 6} // 定义切片
    var rule string = "desc" // 定义规则
    if rule == "desc" {
        SortSlice(nums, DescSlice) // 调用 SortSlice() 函数实现降序排列
    } else {
        SortSlice(nums, AscSlice) // 调用 SortSlice() 函数实现升序排列
    }
}
运行结果如下:

[9 7 6 5 3 2]

在上述代码中,自定义 AscSlice() 函数对切片元素升序排列,自定义 DescSlice() 函数对切片元素降序排列。函数 SortSlice() 的第一个参数 num 接收要排序的切片,第二个参数 sort 接收一个函数,通过函数变量 sort 将函数当作参数进行传递。

在主函数中进行判断,如果变量 rule 的值是 desc,就调用 DescSlice() 函数降序排列切片,否则,调用 AscSlice() 函数升序排列切片。

相关文章