Baham's Blog

Above all else, guard your heart.

闭包closure与堆heap

闭包

Go的函数声明只能在最外层,不可以在函数内申明另一个函数,但可以在函数中声明另一个函数类型的变量,也即闭包closure

package main

import "fmt"

func main() {
    say := func(hi string) func(string) string {
        return func(name string) string {
            return hi + " " + name
        }   
    }
    sayHi := say("Hi")
    fmt.Println(sayHi("World"))
}//本段代码借鉴了《Go语言云动力》中闭包章节处的代码

say即一个closure闭包。

在程序中,hi这个闭包的外围变量在第一个return之后依旧可用,原因在于hi被分配在堆上。

对不会随函数返回小时,而是在用完之后被垃圾回收。

当然,个人对于内存分配了解不多,按照Search结果,简单介绍一下:

堆与栈的区别

堆heap:

由人分配释放,若人不释放,则由OS回收

栈stack:

由编译器自动分配释放,存放函数参数值、局部变量等。




The Original Link: http://baham.github.io/12_04_bi-bao-closureyu-dui-heap.html
If you want to reprint it, please do under the CC BY-NC-SA 4.0

Comments