编译器会自动选择在栈上还是在堆上分配局部变量的存储空间,但可能令人惊讶的是,这个选择并不是由用var还是new声明变量的方式决定的. var global *int func f() { var x int x = 1 global = &x } func g() { y := new(int) *y = 1 } f函数里的x变量必须在堆上分配,因为它在函数退出后依然可以通过包一级的global变量找到,虽然它是在函数内部定义的:用Go语言的术语说,这个x局部变量从函数f中逃逸了.相反,当g函数…