Home > database >  golang struct creation return different memory addresses
golang struct creation return different memory addresses

Time:08-06

I'm having trouble understanding why golang returns a different memory address on what appears to be the same struct (maybe it's not, perhaps it copies with the same values to another memory address?).

Here's the code

package main

import (
    "fmt"
)

type Creature struct {
    Name    string
    isAlive bool
}

func foo() Creature {
    myCreature := Creature{Name: "dino", isAlive: true}
    fmt.Printf("%p\n", &myCreature)
    fmt.Println(myCreature)
    return myCreature
}

func main() {
    myCreat := foo()
    fmt.Printf("%p\n", &myCreat)
    fmt.Println(myCreat)
}

The output of the code is the following

0xc000004090
{dino true}
0xc000004078
{dino true}

As you can see, the memory addresses are different. Why? Should I instead return a memory address?

CodePudding user response:

I'm having trouble understanding why golang returns a different memory address on what appears to be the same struct (maybe it's not, perhaps it copies with the same values to another memory address?).

You didn't return a memory address, you returned a struct.

As you can see, the memory addresses are different.

Because you returned a struct and it was copied to a new one.

Why? Should I instead return a memory address?

Yes, if you want a pointer then return that.

package main

import (
    "fmt"
)

type Creature struct {
    Name    string
    isAlive bool
}

func foo() *Creature {
    myCreature := Creature{Name: "dino", isAlive: true}
    fmt.Printf("%p\n", &myCreature)
    fmt.Println(myCreature)
    return &myCreature
}

func main() {
    myCreat := foo()
    fmt.Printf("%p\n", myCreat)
    fmt.Println(*myCreat)
}

Playground

The rule in Go is that you only use pointers when you actually need them, when you have to modify a struct's values or something. You should not use pointers because you think it might be more efficient. The memory optimiser can do its work more efficiently if you don't force it to do things one way or another.

See https://medium.com/@vCabbage/go-are-pointers-a-performance-optimization-a95840d3ef85, https://betterprogramming.pub/why-you-should-avoid-pointers-in-go-36724365a2a7, and many more articles.

  •  Tags:  
  • go
  • Related