Go is always pass-by-value, but passing a pointer passes the memory address by value, allowing the function to mutate the original data.
Go has no pass-by-reference in the C++ sense. Everything is copied — but when you pass a pointer, the copy is of the address, so the function can follow that address to read or mutate the original value.
When the method needs to mutate the receiver's fields
When the struct is large and copying would be expensive
For consistency — if any method on a type uses a pointer receiver, all methods should
Use value receivers for small, immutable structs like coordinate points
Interfaces store a copy for value receivers; pointer receivers require a pointer to satisfy the interface