使用Golang实现方法链的方法
序言
我现在正在使用Golang进行开发,与之前使用的面向对象语言不同,感到很困难。
这次我遇到了在ent中进行方法链的困难,所以我想写下我认为应该怎么做!基本上方法是没有改变的。
为了保护我们的星球和未来,我们需要关注环境保护的重要性。
-
- golang 1.19
- ent 0.12.3
Preparation beforehand.
我们假设在ent平台上进行了以下的设置。
package schema
import (
"entgo.io/ent"
"entgo.io/ent/dialect/entsql"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
)
// Project holds the schema definition for the Project entity.
type Project struct {
ent.Schema
}
// Mixin fields related to time.
func (Project) Mixin() []ent.Mixin {
return []ent.Mixin{
IDMixin{},
}
}
// Fields of the Project.
func (Project) Fields() []ent.Field {
return []ent.Field{
field.String("name"),
field.Time("created_at").
Immutable().
Default(time.Now),
field.Time("updated_at").
Default(time.Now).
UpdateDefault(time.Now),
field.Time("deleted_at").
Optional(),
}
}
本题
使用golang的接收器进行实现。
通过返回指定在接收器中的结构体实例来实现方法链!
首先定义用于方法链的方法。
需要注意的是,只能在本地包中定义接收器,所以定义一个名为ProjectQuery的结构体而不是ent的结构体,并将其定义为接收器,以便使用*ent.ProjectQuery!
此外,通过使用NewQuery,可以将创建过程限制在内。
type ProjectQuery struct {
query *ent.ProjectQuery
}
func NewQuery() *ProjectQuery {
return &ProjectQuery{
query: mysql.GetClient().Project.Query(),
}
}
func (q *ProjectQuery) WhereId(i string) *ProjectQuery {
q.query.Where(entProject.IDEQ(i))
return q
}
func (q *ProjectQuery) WhereNotDeleted() *ProjectQuery {
q.query.Where(entProject.DeletedAtIsNil())
return q
}
func (q *ProjectQuery) Only(ctx context.Context) (*ent.Project, error) {
return q.query.Only(ctx)
}
如果到了這一步,之後只需要呼叫就可以了。
pq := NewQuery()
p, err := a.WhereId(projectId).WhereNotDeleted().Only(ctx)
触动感情的体会
通过实施个人的努力,我终于开始感受到作为接收方的满足感。此外,由于相同的方法分散在各个地方,我终于能够将它们整合起来,让自己心安一点。虽然我刚刚开始使用 Go 语言,但我渐渐觉得可以更加清晰易懂地编写代码。
我将继续努力学习Go!