参见参考代码https://go.dev/play/p/yIG2B6DKcoc(也粘贴在此处):
就像在这段代码中一样--参数order没有传递给sort.Slice()函数,但它在sort包的调用Less()方法中得到了很好的打印。
是什么属性实现了这一点?
package main
import (
"fmt"
"sort"
)
func main() {
order := "abcd"
s := "bca"
fmt.Printf("ans: %v\n", customSortString(order, s))
}
func customSortString(order string, s string) string {
sort.Slice([]byte(s), func(a, b int) bool {
fmt.Printf("order: %v\n", order) // <------ How does this work? order is not passed to sort.Slice() function.
return s[a] < s[b]
})
return ""
}
2条答案
按热度按时间dojqjjoe1#
https://go.dev/ref/spec#Function_literals:
函数常量是 * 闭包 *:它们可以引用周围函数中定义的变量。2这些变量然后在周围函数和函数文本之间共享,并且只要它们是可访问的,它们就存在。
yvt65v4c2#
Go支持匿名函数,可以形成closures。
在Go语言中,闭包是一个匿名的内部函数,它可以访问创建它的作用域中的变量。即使外部函数完成执行并且作用域被销毁,这也适用。