Does dereferencing a struct return a new copy of struct?

tl;dr Dereferencing (using the * operator) in Go does not make a copy. It returns the value the pointer points to.


No, "assignment" always creates a copy in Go, including assignment to function and method arguments. The statement obj := *p copies the value of *p to obj.

If you change the statement p.color = "purple" to (*p).color = "purple" you will get the same output, because dereferencing p itself does not create a copy.


When you write

obj := *p

You are copying the value of struct pointed to by p (* dereferences p). It is similar to:

var obj me = *p

So obj is a new variable of type me, being initialized to the value of *p. This causes obj to have a different memory address.

Note that obj if of type me, while p is of type *me. But they are separate values. Changing a value of a field of obj will not affect the value of that field in p (unless the me struct has a reference type in it as a field, i.e. slice, map or channels. See here and here.). If you want to bring about that effect, use:

obj := p
// equivalent to: var obj *me = p

Now obj points to the same object as p. They still have different addresses themselves, but hold within them the same address of the actual me object.