質問: 現在Goを勉強しています。 その過程で他の言語でいうクラスメソッドを作りたいと考えました。 ここで質問なのですが、同じpackageに所属しているクラス(構造体?)同士では、同じ名前のクラスメソッドは作れないのでしょうか? この質問に至るまでの過程を説明させていただきます。 まずこのクラスメソッドを作りたいと考えた場合、自分の認識ではGoの場合はパッケージにつける形にするしかないと思っています。 ``` package models type User struct { Name string Gold int } func Create() User { ~~~ } ``` そしてこれを呼び出すためには、 ``` import models models.Create() ``` こうなりますよね? しかしこの書き方には問題があります。 なぜなら同じmodelsのパッケージで別のクラス(例えばItemとか)を追加した場合、そのクラスではCreateというメソッド名のクラスメソッドを作ることはできないからです。 私が考えるこの問題の解決方法は2種類あります。 1つはUserCreateみたいにクラス名をメソッドの前につけることです。 2つめはUserとItemなどをそれぞれ別のフォルダに分けて、別のパッケージにしてしまうことです。 ただどちらにも問題があると思っています。 1つめの方法は、UserCreate,ItemCreate,UserAll,ItemAll....というようにmodelsの下に大量でしかも似たようなメソッド名が並ぶことです。 2つめは、その考え方だと一つのクラスに一つのパッケージという事に結果的になることです。 models_user,models_item,.... 同じフォルダに複数のパッケージはおけないためフォルダもふえます。 どのようにするのがこの場合良いのでしょうか? ご回答いただけると助かります。
回答: Go の流儀に従うのならばこちらが正解です。 > > 1つはUserCreateみたいにクラス名をメソッドの前につけることです。 > > > 前ではなく `CreateUser` や `CreateItem` のように後ろにつけるのが Go が推奨しているやり方です。これは将来の読みやすさを担保するためです。より細かく言うと「動詞 + 目的語(対象)」とし、特にコンストラクタ相当については`NewXXX` とする習慣が一般的と言って良いでしょう。 また Go には **クラスメソッド** という概念はありません。他言語における概念や方法論を無理やり持ち込んで考えることはおすすめできません。あくまでも Go のやり方で、パッケージの関数と考えるべきでしょう。 もちろん構造体(クラス)同士の関係が遠いのならばパッケージを分けることも視野に入りますが、そのようなケースではないと質問文より判断しました。