Go言語100Tips No.42

mizue
·

Go言語100Tips ありがちなミスを把握し、実装を最適化する の No.42を読んだ。ここから第6章 関数とメソッド。

No.42は、値レシーバかポインタレシーバか、という話。基本的には、正当な理由がない限り値レシーバを使うべき、とのこと。正当な理由とは?

  • ポインタレシーバでなければならない場合

    • メソッドがレシーバを変更する必要がある場合。

    • メソッドのレシーバがコピーできないフィールドを含む場合。

  • ポインタレシーバであるべき場合

    • レシーバが大きなオブジェクトである場合。

  • 値レシーバでなければならない場合

    • レシーバの不変性を強調する必要がある場合

    • レシーバがマップ、関数、チャネルの場合

また、レシーバの構造体の中の値を変更する場合、値レシーバでも実現可能だが、明確にレシーバが可変であることを強調するためにポインタレシーバにする方が良いかもしれない、とのこと。なるほど。

そして、レシーバ型の混在は一般的には避けるべきだが、絶対ではない。どうしても必要な場合はこの限りではない、見極めること。

とりあえずポインタでいいか、と、なりがちだったが、よく考えて使い分けたい。

@mizue
Healthy Programmer