gpt4 book ai didi

google-app-engine - 使用 golang 中的接口(interface)避免代码重复

转载 作者:IT王子 更新时间:2023-10-29 01:41:56 26 4
gpt4 key购买 nike

我正在使用谷歌云数据存储(或谷歌应用引擎数据存储)来存储不同的对象。这些对象中的大多数都是相似的,因此我最终得到了大量的代码重复。

例如,这里有两个创建方法,两个不同的对象,accountindex

func (account *Account) Create(ctx context.Context) (*Account, error) {
if ret, err := datastore.Put(ctx, account.newKey(ctx), account); err != nil {
log.Errorf(ctx, "Error while creating Account : %v\n", err)
return nil, err
} else {
account.Id = strconv.FormatInt(ret.IntID(), 10)
}

return account, nil
}

func (index *Index) Create(ctx context.Context) (*Index, error) { 
if ret, err := datastore.Put(ctx, index.newKey(ctx), index); err != nil {
log.Errorf(ctx, "Error while creating Index : %v\n", err)
return nil, err
} else {
index.Id = strconv.FormatInt(ret.IntID(), 10)
}

return index, nil
}

如您所见,除了持有者类型、返回类型和错误消息之外,这两个片段是相同的。

避免这种代码重复的惯用方法是什么?

最佳答案

使用接口(interface)定义方法New Key()Set ID()

type Entity interface {
SetId(id int64)
NewKey(c context.Context) *datastore.Key
}

func create(c context.Context, entity Entity) error {
if ret, err := datastore.Put(c, entity.NewKey(c), entity ); err != nil {
log.Errorf(c, "Error while creating entity: %v\n", err)
return err
} else {
entity.SetId(ret.IntID())
return nil
}
}

func (index *Index) Create(c context.Context) (*Index, error) {
return index, create(c, index)
}

func (account *Account) Create(c context.Context) (*Account, error) {
return account, create(c, account)
}

关于google-app-engine - 使用 golang 中的接口(interface)避免代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39720221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com