41

次の構造をクリーンアップするための最良の方法についてのアドバイスを探しています。Go には静的メソッドがなく、通常は機能を別のパッケージにカプセル化することをお勧めします。私の構造体型は相互に参照しているため、循環インポートのために個別のパッケージで宣言できません。

type Payment struct {
    User *User
}

type User struct {
    Payments *[]Payments
}

func (u *User) Get(id int) *User {
    // Returns the user with the given id 
}

func (p *Payment) Get(id int) *Payment {
    // Returns the payment with the given id 
}

しかし、ユーザーまたは支払いをロードしたい場合は、レシーバーを捨てるだけです:

var u *User
user := u.Get(585)

関数自体に名前を付けることができますが、これは汚れていると思います。

func GetUser(id int) *User {
    // Returns the user with the given id 
}

func GetPayment(id int) *Payment {
    // Returns the payment with the given id 
}

.Get関数自体に構造体の名前を書き込まずに、構造体で呼び出しまたは同様のことができるようにしたいと本当に思っています。これを行うための慣用的な方法は何ですか?

4

4 に答える 4

25

Golang はコンストラクターをサポートしていません。

代わりにファクトリ関数を使用してください ( Effective Go リファレンス)。規則では、Newプレフィックスを使用します。

func NewUser(id int) *User {
    // Returns new User instance
}

コンストラクターとファクトリー関数の違いは、ファクトリー関数がUser構造体に「付加」されていないことです。Userこれは、Java/C++ のようなコンストラクターが新しく作成されたUserオブジェクトをその場で変更するメソッドであるときに、たまたま戻る通常の関数です。

于 2014-11-25T10:10:03.743 に答える