为了账号安全,请及时绑定邮箱和手机立即绑定

“静态”方法设计

“静态”方法设计

Go
阿晨1998 2021-06-27 16:12:15
我正在寻找有关清理以下结构的最佳方法的建议。我知道 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 *Useruser := 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在结构上调用或类似,而无需在函数本身中写入结构的名称。这样做的惯用方法是什么?
查看完整描述

3 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

GetUser()GetPayment()让我觉得非常清楚和惯用。我不确定你觉得他们有什么不洁之处。

调用.Get()一个结构体返回另一个结构体让我觉得非常奇怪、不清楚和单调。

我认为这可能只是坚持惯用语并相信您会习惯的情况。


查看完整回答
反对 回复 2021-06-28
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

Golang 不支持构造函数。


改用工厂函数(Effective Go 参考)。约定是使用New前缀:


func NewUser(id int) *User {

    // Returns new User instance

}

构造函数和工厂函数的区别在于工厂函数没有“附加”到User结构体上。这是一个碰巧返回的正常函数,User而 Java/C++ 之类的构造函数是一种修改新创建User对象的方法。


查看完整回答
反对 回复 2021-06-28
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

有一个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.


查看完整回答
反对 回复 2021-06-28
  • 3 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信