golang で関数を作成する際、引数を値渡しにするか、参照渡しにするのか、迷うことがあった。いろいろな記事を読んで、今のところの結論は以下。
- 関数内で、引数で渡ってきたものに対する編集が必要な場合、つまり、関数の外側の世界に副作用を起こしたい場合、参照渡しにする。(まあ、これは値渡しではできないので、当たり前のことではあるが・・)
- 例えば、大きな構造体を関数に渡す場合など、関数の引数のサイズが大きい場合、参照渡しにする。これは、値渡しにすると、関数呼び出しの際に引数の値のコピーが走るので、パフォーマンス的に宜しくないため。
- map や slice はそもそも参照渡しとなるので迷うところはない。つまり、map や slice の変数のまま渡せば良い。