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() 函数升序排列切片。
ICP备案:
公安联网备案: