函数在Go中的作用:
    参数、返回值、绑定到变量。我们称之为function value

    函数——编译——->代码段(函数指令)

    function value本质是一个指针
    ——->指向runtime.funcval结构体(存了个地址)
    ——->指向函数指令入口
    image.png

    一个变量存着一个地址,这个地址存了一个地址

    为什么需要二级地址呢?
    为了处理闭包。

    1.什么是闭包
    自由变量(函数外定义,函数内使用)

    脱离上下文,也能使用自由变量

    捕获变量

    Go语言中闭包是有捕获列表的Function Value

    2.闭包有什么用

    sort.Slice

    大部分地方都可以用闭包
    最典型的比如,用于返回值是一个函数的函数,比如各种http 的 middleware。
    再比如go 一个 goroutines。
    闭包一个典型的优势是可以在函数范围之外,调用函数内部的变量。

    Go中的闭包无所不在.
    Go中所有的函数和方法 (除了内置函数) 都可以看作是闭包.
    这是为什么Go做为一个静态语言, 却和动态语言一样灵活.

    https://zhuanlan.zhihu.com/p/92634505

    image.png