golang底层 其他
动态栈
栈是自动增长的,默认2KB,32位架构最大250M,64位架构最大1G,可用runtime/debug.SetMaxStack来设置
每次执行函数调用时Go的runtime都会进行检测,若当前栈的大小不够用,则会触发“中断”,从当前函数进入到Go的运行时库,Go的运行时库会保存此时的函数上下文环境,然后分配一个新的足够大的栈空间,将旧栈的内容拷贝到新栈中,并做一些设置,使得当函数恢复运行时,函数会在新分配的栈中继续执行,仿佛整个过程都没发生过一样,这个函数会觉得自己使用的是一块大小“无限”的栈空间。
逃逸
func f(){
p := Point{1,2}
return &p
}
编译器会通过逃逸分析技术,分析出p的作用范围,p会从栈中逃逸,被分配到堆上
闭包
闭包是函数和它所引用的环境,返回闭包时不是返回函数,而是返回结构体,结构体中包含函数和引用的环境中的变量地址