33345


現在Goを勉強しています。  
その過程で他の言語でいうクラスメソッドを作りたいと考えました。  
ここで質問なのですが、同じpackageに所属しているクラス(構造体？)同士では、同じ名前のクラスメソッドは作れないのでしょうか？

この質問に至るまでの過程を説明させていただきます。

まずこのクラスメソッドを作りたいと考えた場合、自分の認識ではGoの場合はパッケージにつける形にするしかないと思っています。

[code]

    package models
    
    type User struct {
        Name string
        Gold int
    }
    
    func Create() User {
        ~~~
    }
    
[/code]

そしてこれを呼び出すためには、

[code]

    import models
    
    models.Create()
    
[/code]

こうなりますよね？

しかしこの書き方には問題があります。  
なぜなら同じmodelsのパッケージで別のクラス(例えばItemとか)を追加した場合、そのクラスではCreateというメソッド名のクラスメソッドを作ることはできないからです。

私が考えるこの問題の解決方法は２種類あります。  
１つはUserCreateみたいにクラス名をメソッドの前につけることです。  
２つめはUserとItemなどをそれぞれ別のフォルダに分けて、別のパッケージにしてしまうことです。

ただどちらにも問題があると思っています。  
１つめの方法は、UserCreate,ItemCreate,UserAll,ItemAll....というようにmodelsの下に大量でしかも似たようなメソッド名が並ぶことです。

２つめは、その考え方だと一つのクラスに一つのパッケージという事に結果的になることです。  
models_user,models_item,....  
同じフォルダに複数のパッケージはおけないためフォルダもふえます。

どのようにするのがこの場合良いのでしょうか？  
ご回答いただけると助かります。


CC BY-SA 3.0
2017-03-15T09:34:45.463
33342
2017-03-15T12:10:37.303
20353
question
go
Goでクラスメソッドのようなものを作成するには？


Go の流儀に従うのならばこちらが正解です。

> １つはUserCreateみたいにクラス名をメソッドの前につけることです。

前ではなく `CreateUser` や `CreateItem` のように後ろにつけるのが Go
が推奨しているやり方です。これは将来の読みやすさを担保するためです。より細かく言うと「動詞 +
目的語(対象)」とし、特にコンストラクタ相当については`NewXXX` とする習慣が一般的と言って良いでしょう。

また Go には **クラスメソッド** という概念はありません。他言語における概念や方法論を無理やり持ち込んで考えることはおすすめできません。あくまでも
Go のやり方で、パッケージの関数と考えるべきでしょう。

もちろん構造体(クラス)同士の関係が遠いのならばパッケージを分けることも視野に入りますが、そのようなケースではないと質問文より判断しました。


CC BY-SA 3.0
2017-03-15T12:10:37.303
33345
2017-03-15T12:10:37.303
208
33342
answer