golang从函数返回对象

时间:2015-03-04 09:47:26

标签: c go

当我从go中的函数返回一个新对象时,我很难理解究竟发生了什么。

我有这个

func createPointerToInt() *int {
    i := new(int)
    fmt.Println(&i);
    return i;
}

func main() {
    i := createPointerToInt();
    fmt.Println(&i);
}

返回的值是

0x1040a128
0x1040a120

我希望这两个值是相同的。我不明白为什么会有8个字节的差异。

我认为是等效的C代码:

int* createPointerToInt() {
    int* i = new int;
    printf("%#08x\n", i);
    return i;
}

int main() {
    int* r = createPointerToInt();
    printf("%#08x\n", r);
    return 0;
}

返回的地址是相同的:

0x8218008
0x8218008

我在这里错过了一些令人眼花缭乱的东西吗?任何澄清将不胜感激!

3 个答案:

答案 0 :(得分:7)

您正在此处打印指针的地址fmt.Println(&i);。试试这个:

func main() {
    i := createPointerToInt();
    fmt.Println(i); //--> Remove the ampersand
}

i是从createPointerToInt返回的指针 - 而&i是您尝试打印的指针的地址。请注意您的C示例中正确打印它:

printf("%#08x\n", r);
                 ^No ampersand here

答案 1 :(得分:2)

&i更改为i。您打印i的值时打印i的地址。

func createPointerToInt() *int {
     i := new(int)
     fmt.Println(i);
     return i;
}

func main() {
    i := createPointerToInt();
    fmt.Println(i);
}

答案 2 :(得分:0)

但是原始代码中的两个指针的地址(指针指向的内存地址)是不同的呢?

func main() {
    i := createPointerToInt();
    fmt.Println(&i);
}

相当于:

func main() {
    var i *int  // declare variable i
    i = createPointerToInt(); // assign value of
                              // a different i that was 
                              // declared and initialized
                              // inside the function
    fmt.Println(&i);
}

编辑:

要打印您需要使用的结构的地址:

fmt.Printf("%p\n", &your_struct)

golang.org/pkg/fmt/

例如:

goplayground