使用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!

广告
将在 10 秒后关闭
bannerAds