The main difference is the idea of pass by value
vs pass by reference
When you're using example A you're passing be reference, meaning that any changes you apply to n
inside of func (n *Node) height
will apply to the Node you're using to call Node.height()
.
By comparison, what you're doing in example B is passing by value where you're really just passing a copy of the Node you're using to call Node.height()
so any changes to that Node will not apply outside of the function.
Here is a small playground to demonstrate the differences: http://play.golang.org/p/JodPRPBHDg
Notice in the example that when you call node.incHeight()
, it goes to the function:
func (n Node) incHeight() uint8 {
n.value++
return n.value
}
Because this is pass by value the node.value
is still the same unless you store the returned value as node.value
. However, if you call node.incrementHeight()
it goes to the function:
func (n *Node) incrementHeight() {
n.value++
return
}
This will change the value of node.value
without needing to return anything because its referencing the original struct, rather than a copy of the struct.
So in answer to which would you choose and why, it really depends on whether you want to be able to make lasting changes to the struct you're using to call the function or if you'd rather just pass a copy that can see and alter the values but only while within the function and not have any lasting effects on the original struct.