Go中调用的函数如何访问调用函数的参数?

nukf8bse  于 2023-04-03  发布在  Go
关注(0)|答案(2)|浏览(122)

参见参考代码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 ""
}
dojqjjoe

dojqjjoe1#

https://go.dev/ref/spec#Function_literals:
函数常量是 * 闭包 *:它们可以引用周围函数中定义的变量。2这些变量然后在周围函数和函数文本之间共享,并且只要它们是可访问的,它们就存在。

yvt65v4c

yvt65v4c2#

Go支持匿名函数,可以形成closures
在Go语言中,闭包是一个匿名的内部函数,它可以访问创建它的作用域中的变量。即使外部函数完成执行并且作用域被销毁,这也适用。

相关问题