避免在golang中使用接口进行代码重复

时间:2016-09-27 08:51:31

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

我正在使用Google Cloud Datastore(或Google应用引擎数据存储区)来存储不同的对象。大多数这些对象都是相似的,因此我最终会有大量的代码重复。

例如,以下是两个创建方法,包含两个不同的对象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
}

正如您所看到的,两个片段是相同的,除了持有者类型,返回类型和错误消息。

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

1 个答案:

答案 0 :(得分:2)

使用界面定义方法NewKey()& SetID()

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)
}