Tom
Tom

Reputation: 2198

golang return object from a function

I am struggling to understand exactly what is happening when you return a new object from a function in go.

I have this

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

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

The values printed returned are

0x1040a128
0x1040a120

I would expect these two values to be the same. I do not understand why there is an 8 byte difference.

In what I see as the equivalent C code:

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

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

The address returned is the same:

0x8218008
0x8218008

Am I missing something blindingly obvious here? Any clarification would be greatly appreciated!

Upvotes: 6

Views: 10928

Answers (3)

Akavall
Akavall

Reputation: 86128

But how come in your original code the addresses of the two pointers (not memory addresses the pointers are pointing too) are different?

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

Is equivalent to:

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);
}

Edit:

To print the address of a struct you need to use:

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

golang.org/pkg/fmt/

For example:

goplayground

Upvotes: 0

Sadique
Sadique

Reputation: 22813

You are printing the address of the pointer here fmt.Println(&i);. Try this:

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

i is the pointer returned from createPointerToInt - while &i is the address of the pointer you are trying to print. Note in your C sample you are printing it correctly:

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

Upvotes: 7

Grzegorz Żur
Grzegorz Żur

Reputation: 49161

Change &i to i. You are printing address of i while you should print the value of i.

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

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

Upvotes: 2

Related Questions