在 Go 语言中,函数指针指向函数的入口地址,可存储在变量中或传递给函数。使用函数指针有助于解耦调用函数和实现函数的代码。它可用于存储函数、传递函数或返回函数。一个应用场景是创建可排序键值对,通过函数指针定义自定义排序规则,将键值对按值进行升序排序。
Go 语言中的函数指针
函数指针是指向函数的指针。在 Go 语言中,函数是第一类值,因此可以存储在变量中、传递给函数或返回函数。使用函数指针的主要优点是解耦了调用函数和实现函数的代码。
函数指针的本质
函数指针本质上是一个指向函数入口地址的指针。在 Go 语言中,函数指针的类型是 func(*args)(*result)
,其中:
*args
是函数参数类型的指针*result
是函数返回类型的值或指针函数指针的用法
1. 存储函数
func add(a, b int) int { return a + b } func main() { // 将 add 函数存储在变量 f 中 f := add // 通过 f 调用 add 函数 fmt.Println(f(1, 2)) // 输出:3 }
2. 传递给函数
func apply(f func(int) int, arg int) int { return f(arg) } func main() { // 将 add 函数传递给 apply 函数 result := apply(add, 10) fmt.Println(result) // 输出:11 }
3. 返回函数
func getAdder(val int) func(int) int { return func(arg int) int { return val + arg } } func main() { // 获得一个返回 10 加数的函数 add10 := getAdder(10) // 使用 add10 函数 fmt.Println(add10(20)) // 输出:30 }
实战案例:创建可排序键值对的函数类型
以下是一个使用函数指针创建可排序键值对的 Go 语言程序:
type kv struct { key string val int } func (kv *kv) SortByValue() { sort.Slice(kv, func(i, j int) bool { return kv[i].val < kv[j].val }) } func main() { kvList := []*kv{ {"key1", 10}, {"key2", 5}, {"key3", 15}, } kvList.SortByValue() for _, kv := range kvList { fmt.Println(kv.key, kv.val) } }
输出:
key2 5 key1 10 key3 15
在这个例子中,SortByValue
函数指针定义了一个自定义排序规则,将 kv
切片中的元素按值进行升序排序。
以上是golang函数指针的本质和用法的详细内容。更多信息请关注PHP中文网其他相关文章!