そもそも
Goなどのような値渡し言語では呼び出された関数はもとの引数への参照ではなく、引数のコピーだけを受け取るので、関数が引数を変更する必要がある場合、ポインタを渡すことは必須である。
ポインタを用いることのメリット
- 上記の通り、ポインタを引数に渡すことで複数の関数間で同じオブジェクトを扱うことができ、そのオブジェクトに対して操作を行うことができる(というより、オブジェクトに変更を加える際は、ポインタ渡しが必須である)。
- ポインタは比較的に軽く(8byte=64bit)ただのメモリアドレスのため、ポインタを使って大きな構造体を引数に渡すことも可能になる。もし値渡しを行っていると、相対的にさらに大きなシステムリソース(メモリや時間)を毎回のコピーで消費することになる。そのためGolangでは構造体を渡す際はポインタを使うことが推奨されている。
channel, slice, map について
Go言語のchannel、slice、mapの3つの型はメカニズムを実現するポインタのようなものであるため、直接渡すことができ、アドレスを取得してポインタを渡す必要はない。しかし、もし関数がsliceの長さを変更する場合はアドレスを取得し、ポインタを渡す必要がある。