堆和栈的定义: 

堆:一般由程序员手动释放,若程序结束时未释放,将由os自动回收,分配方式类似于链表。(在数据结构中的堆是个树)
栈:由编译器自动分配与释放,存储函数的参数或局部变量的值,类似于数据结构中的栈。
并不是定义在函数内部的局部变量在访问退出时就被回收。

下面看两个例子: 

var p *int
fun f(){
    var i int
    i=1
    p=&i
}

在这个例子里,函数的局部变量i被赋值给了全局变量p,因此,函数结束后i不会被释放,所以i申请在堆上。

fun f(){
    p:=new(int)
    *p=1
}

在这个例子里,局部变量p有new申请空间。退出函数时,p将被释放,因此p分配在栈上。

总结: 

区别于其他语言,go的特点就是:虽然变量申请在堆空间上,但是他有自动回收垃圾的功能,所以这些堆地址空间也无需手动回收,系统会在需要释放的时刻自动进行垃圾回收。