Go语言函数变量(将函数保存在变量中)
在 Go 语言中,函数也是一种类型,可以像其他数据类型一样将函数保存在变量中。代码如下:
注意,如果在定义函数时设置了参数和返回值,那么在定义函数变量时,用于声明函数类型的 func 关键字后面也需要加上函数的参数列表和返回类型列表。
【实例】切片排序。使用函数变量的形式实现切片排序功能,根据指定的排序规则实现对应的排序。代码如下:
在主函数中进行判断,如果变量 rule 的值是 desc,就调用 DescSlice() 函数降序排列切片,否则,调用 AscSlice() 函数升序排列切片。
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() 函数升序排列切片。