Common dilemma when defining the methods of a struct.
In particular when deciding your method receivers, should you use pointer receivers or value receivers?
func (t *Type) Method() {} //pointer receiver
vs
func (t Type) Method() {} //value receiver
Method receivers can be assimilated to function arguments in their behavior, and everything applicable to passing a pointer or a value as a function argument still applies for method receivers.
When should you use pointer receivers
Modify the receiver
If you want to change the state of the receiver in a method, manipulating the value of it, use a pointer receiver. It’s not possible with a value receiver, which copies by value. Any modification to a value receiver is local to that copy.
Optimization
If the struct you’re defining the method on is very large, copying it would be far too expensive than using a value receiver.
Value receivers operate on a copy of the original type value. This means that there is a cost involved, especially if the struct is very large, and pointer received are more efficient.
When value receivers are better
If you don’t need to edit the receiver value, use a value receiver.
Value receivers are concurrency safe, while pointer receivers are not concurrency safe.
When you should make a tradeoff
There is a situation when you might want to use pointer receivers for methods where you’d normally use a value receiver, and it’s when you have other pointer receivers defined on that type, and for consistency you should use pointer receivers across all the methods.