Go 中调用的函数可以通过函数参数来获取调用函数的参数。在 Go 中,参数可以通过传值或传引用的方式传递给函数,函数可以通过参数来获取调用者传递的值或指针。如果参数是值类型,函数内部的操作将会在参数的拷贝上进行,不会影响到调用者传递的原始值。如果参数是指针类型,函数内部的操作将会对指针指向的原始值进行修改。通过这种方式,函数可以访问和修改调用函数的参数,从而实现更灵活的功能。无论是值类型还是指针类型的参数,函数都可以通过参数来获取调用者传递的值或指针,并在函数内部进行相关操作。
问题内容
请参阅参考代码https://go.dev/play/p/yig2b6dkcoc(也粘贴在此处):
就像这段代码一样 - 参数顺序没有传递给 sort.slice() 函数,但它在排序包的调用 less() 方法中得到了很好的打印。
实现此功能的属性是什么?
package main
import (
"fmt"
"sort"
)
func main() {
order := "abcd"
s := "bca"
fmt.Printf("ans: %vn", customSortString(order, s))
}
func customSortString(order string, s string) string {
sort.Slice([]byte(s), func(a, b int) bool {
fmt.Printf("order: %vn", order) // <------ How does this work? order is not passed to sort.Slice() function.
return s[a] < s[b]
})
return ""
}
解决方法
https://www.php.cn/link/58b7483ba899e0ce4d97ac5eecf6fa99:
函数文字是闭包:它们可以引用周围函数中定义的变量。然后,这些变量在周围的函数和函数文字之间共享,并且只要可访问,它们就会一直存在。