我正在寻找关于清理以下 struct 的最佳方法的建议.我知道Go没有静态方法,通常是better to encapsulate functionality in a separate package.我的 struct 类型相互引用,因此由于循环导入,无法在单独的包中声明.

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 
}

我真的希望能够只在 struct 上调用.Get或类似的函数,而不在函数本身中编写 struct 的名称.做这件事的惯用方式是什么?

推荐答案

GetUser()GetPayment()给我的印象是非常清楚和地道.我不知道你觉得它们有什么不洁之处.

在一个struct上调用.Get()返回another struct,这让我觉得非常奇怪、不清楚、不符合实际.

我认为这可能是一个坚持这个习语并相信你会习惯它的例子.

Go相关问答推荐

追加一个字节数组的分配比2个字节数组的分配要少得多

读取JSON数据并在网页上显示

GORM Find方法中缺少字段

golang 的持久隐蔽服务

Go中的Slice[:1][0]与Slice[0]

什么东西逃到了堆里?

从文件读取字节,将其保存到 struct 体并修改值

如何使用 AWS sdk 在 Go 中正确解组 PartiQL 查询的结果?

调用库和直接操作效率有区别吗?

在 Go 中将元数据从一个 JPEG 复制到另一个

Go-如何在递归函数中关闭通道

Golang chromedp Dockerfile

如何解决构建Docker Compose时的权限被拒绝问题

Go 的垃圾收集器在使用时删除 ZeroMQ 套接字

Golang并发写入多个文件

GoReleaser 和 ssh-agent Github 操作:为什么无法读取用户名...终端提示已禁用?

Golang SSH客户端错误无法验证,try 的方法[无公钥],没有支持的方法

Terraform 自定义提供程序 - 数据源架构

try 执行`go test ./... -v`时,Golang中有没有办法设置标志

Golang 泛型同时具有接口和实现