update.この記事はGopher道場アドベントカレンダーの1日目の記事です。ポインタをレシーバにする場合Goでは次のようにtypeで型を定義し、レシーバを指定することでメソッドを定義することができます。fmt.Println("method")}メソッドを呼び出すためには、次のようにセレクタでアクセスし呼び出します。p.M()}レシーバの型がポインタであれば、次のように呼び出しても構いません。次の例では、t.M()は(&t).M()と同じように解釈されます。(&t).M()と同じ}この例ではT型にメソッドMが紐付いているわけではありません。そのため、次のコードを実行すると102030ではなく303030が表示されます。}}このコードを分かりやすく書き直してみると次のようになります。forの中でtのポインタは常に同じなので、(&t).Mもずっと同じメソッド値をスライスにappendしていることになります。}}元ネタ:https://twitter.com/inukirom/status/1065520332411363328メソッドセット型Tが持つメソッドセットと型*Tの持つメソッドセットは次のようになっています。型*Tのメソッドセットはgだけではなく、型Tのfも含みます。そのため、(&T{}).f()などは実行できますが、(T{}).g()は実行できません。(*&T{}).g()}一方で、次のようにT{}を一度変数に入れることにより、&tのようにポインタを取れるようになるため、t.g()は(&t).g()と解釈されます。型Tのメソッドセットには、gは含まれないということには注意しましょう。(&t).g()と解釈}Goではあるインタフェースのメソッドセットがある型のメソッドセットの部分集合のとき、その型はそのインタフェースを実装していることになります。そのため、次の例では、型Tはメソッドセットにgを含まないため、インタフェースIを実装していることにはなりません。t}まとめこのように、レシーバとポインタにまつわる問題は発見しづらいため、レシーバをポインタにした場合は変数(ゼロ値で扱いたい時を除き)やスライスの要素はポインタにすべきでしょう。Gopher道場では、このように実際の業務でハマりやすいポイントを解説を踏まえながら説明するようにしています。興味を持たれた方は次回の開催ではぜひ参加してみてください。artistFollowMercariフリマアプリ「メルカリ」を、グローバルで開発しています。upLoginユーザーは見つかりませんでした。