Go言語での構造体のメソッドのレシーバ型を値にすべきかポインタにすべきかの一般的なベストプラクティスは存在しますでしょうか。
色々と調べてみたのですが、諸説あるようで困っています。
go
1/* 例(少し不適切な例かも) */ 2type Hoge struct { 3 data int 4} 5 6func (h Hoge) getIncremented() int { 7 return h.data + 1 8} 9 10func (h *Hoge) increment() { 11 h.data += 1 12}
調べていると、特に理由がなければポインタ型のほうを使うという意見が多いようです。
理由は以下。
- ポインタ型の場合、コピーが発生しない
- 構造体のメソッドは構造体のデータと紐付いた処理が多いので(データを直接変更できる)ポインタ型を普段使いするのが自然だ
一方でポインタ型を使うのは構造体のデータを直接変更する真の理由があるときに限り、それ以外は値型を使うべきだという意見も見かけます。理由は以下。
- Goは仮引数に
const
をつけられない。データを変更しない場合は値型にしておけば元のデータが書き換わらないことを保証できる - 冗長なコピーの計算コストなんて知れてる程度だから気にしないでいい(!?)
C++を使っていると、クラスや構造体をread-onlyで引数に取る場合、const
付き参照(const Hoge&
)で受けるのが一般的(これによってコピーが発生しないので効率が良く、かつデータが書き換わらないことも保証できるから)だと思いますが、Goでは何がベストプラクティスなのでしょうか。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/13 03:50
2020/01/13 17:46 編集
2020/01/13 17:16
2020/01/13 17:24
2020/01/13 17:51
2020/01/15 13:41
2020/01/15 23:57
2020/01/17 11:48
2020/01/18 09:03
2020/01/26 04:27