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

标签 google-app-engine go google-cloud-datastore

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

例如,这里有两个创建方法,两个不同的对象,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/

相关文章:

java - 如何运行 App Engine Cloud Endpoints 的临时环境?

url - 如何使用 go 在 OAuth 中编写重定向 URL

google-app-engine - AppEngine 数据存储区 : byte slice vs datastore. 字节串

google-app-engine - 坏值错误 : Expected GeoPt

python - 从刚刚创建的模型实例中检索数字 ID

java - Mapreduce - 排序作业?

python - 如何使这个 Python 函数异步?

google-app-engine - App Engine 裸域重定向 + SSL

go - 有没有办法拦截go函数?

go - 如何从多值返回函数访问单个值?