Go 关于从函数返回指针的问题

Go 关于从函数返回指针的问题,go,Go,我编写了以下测试代码: import "fmt" func getIntPointer(i int) *int { var result int result = i + 1 return &result } func main () { ip1 := getIntPointer(4) ip2 := getIntPointer(10) fmt.Println(*ip1, *ip2) fmt.Printf(&q

我编写了以下测试代码:

import "fmt"

func getIntPointer(i int) *int {
    var result int
    result = i + 1
    return &result
}

func main () {
    ip1 := getIntPointer(4)
    ip2 := getIntPointer(10)
    fmt.Println(*ip1, *ip2)
    fmt.Printf("%p %p\n", ip1, ip2)
}
我希望看到:

11
11
address1
address1
假设第二次调用将使用相同的函数变量空间(基于我的C背景,函数停止工作后,堆栈中的所有函数变量都可以用下一次函数调用重写)。但我得到的却是:

5
11
address1
address2
为什么我会得到这样的结果?
为什么与预期输出有差异?

此行为是逃逸分析的结果。编译器检测到变量
result
转义函数,因此它被分配到堆上。这就是为什么每次调用
getIntPointer
都会返回一个新的
结果
指针。该功能相当于:

func getIntPointer(i int) *int {
    result:=new(int)
    *result=i+1
    return result
}

没有错,不需要选择。这是预期的行为。你为什么会预期这些值?这种行为是正确的大约30年前我学过C,他们告诉我们这是一种错误的方法,因为函数停止工作后,堆栈中的所有函数变量都可以用下一次函数调用重写。是的,但是Go不是C。编译器看到
result
的地址被返回,并立即将其分配到堆上。谢谢你,马克,现在已经清楚了。:)谢谢,这是一个智能编译器功能