猿问

“静态”方法设计

我正在寻找有关清理以下结构的最佳方法的建议。我知道 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在结构上调用或类似,而无需在函数本身中写入结构的名称。这样做的惯用方法是什么?


阿晨1998
浏览 168回答 3
3回答

繁星淼淼

GetUser()并GetPayment()让我觉得非常清楚和惯用。我不确定你觉得他们有什么不洁之处。调用.Get()一个结构体返回另一个结构体让我觉得非常奇怪、不清楚和单调。我认为这可能只是坚持惯用语并相信您会习惯的情况。

qq_笑_17

Golang 不支持构造函数。改用工厂函数(Effective Go 参考)。约定是使用New前缀:func NewUser(id int) *User {    // Returns new User instance}构造函数和工厂函数的区别在于工厂函数没有“附加”到User结构体上。这是一个碰巧返回的正常函数,User而 Java/C++ 之类的构造函数是一种修改新创建User对象的方法。

翻过高山走不出你

有一个Get功能完全没问题;它在任何方面都不是单调的。func (u *User) Get(id int) *User没有任何意义,虽然,它应该是func (u *User) Get(id int) error。您缺少的一件事是您可以在指针上定义一个方法接收器,然后在该方法内部取消引用该指针以覆盖它指向的内容。像这样:// Returns the user with the given id func (u *User) Get(id int) error {    *u = User{ ... } // dereference the pointer and assign something to it    return nil // or an error here}如果有任何问题,返回一个错误。现在你可以说type Getter interface {    Get(int) error}因此Get(id)error可以定义任何定义的类型。然后你会像这样使用它:u := new(User)if err := u.Get(id); err != nil {    // problem getting user}// everything is cool.
随时随地看视频慕课网APP

相关分类

Go
我要回答