2017-05-07 93 views
-2

内的工作,我有这个功能,这需要从结构输入的未知量:如何使围棋追加一系列循环

func GetAllXXXByQueryFilters(ctx context.Context, filters ...XXXFilters) ([]XXX, error) { 
    var allKeys []*datastore.Key 
    var xxx []XXX 
    for _, filter := range filters { 
     query := datastore.NewQuery("XXX") 
     if filter.Foo != "" { 
      query = query.Filter("foo =", filter.Foo) 
     } 
     if filter.Bar != "" { 
      query = query.Filter("bar =", filter.Bar) 
     } 
     keys, err := models.DSClient().GetAll(ctx, query, &xxx) 
     if err != nil { 
      return nil, err 
     } 
     allKeys = append(keys) // PROBLEM HERE 
    } 
    for i, key := range allKeys { 
     xxx[i].ID = key.ID 
    } 
    return xxx, nil 
} 

的问题是,allKeys将覆盖以前的查询结果。我以前做克服的问题:

keys1, err := models.DSClient().GetAll(ctx, query1, &xxx) 
keys2, err := models.DSClient().GetAll(ctx, query2, &xxx) 
keys = append(keys1, keys2...) 

但我希望我的GetAllXXXByQueryFilters更加复杂和避免重复代码,现在我似乎无法弄清楚如何我可以从for _, filter := range filters循环键存储然后把它们全部追加。所以我希望可能有一个更明智的方法去取代allKeys = append(keys)这条线,以便它不覆盖以前的键?

回答

1

附加到这样的切片:

allKeys = append(allKeys, keys...) 

的第一个参数是附加的切片。剩下的参数是要追加到切片的元素。追加函数返回新的片。

+0

太好了,非常感谢:) – fisker