如果仅更改一种参数类型,请避免代码重复

如您所见,这些功能仅在keys []int和keys []*int(以及名称)上有所不同。


func (db *myDB) QueryWithKeys(keys []int) ([]*models.Player) {

    var players = make([]*models.Player, len(keys))

  _ := db.Model(&players).Where("id in (?)", pg.In(keys)).Select()

  // several other equal code here

    return players

}


func (db *myDB) QueryWithPointerKeys(keys []*int) ([]*models.Player) {

    var players = make([]*models.Player, len(keys))

    _ := db.Model(&players).Where("id in (?)", pg.In(keys)).Select()

  // several other equal code here

    return players

}

有没有办法避免这种代码重复?


杨魅力
浏览 148回答 2
2回答

慕标5832272

您可以重新定义方法以接受keys类型参数interface{}以及指示参数底层切片中元素数量的length类型参数,此长度将由调用者提供。intkeysfunc (db *myDB) QueryWithKeys(keys interface{}, length int) ([]*models.Player) {    var players = make([]*models.Player, length)    _ := db.Model(&players).Where("id in (?)", pg.In(keys)).Select()    // several other equal code here    return players}有了它,您就可以像这样使用它:var keys []int = // get list of integers from whereverplayers := db.QueryWithKeys(keys, len(keys))var keys2 []*int = // get list of integer pointers from whereverplayers2 := db.QueryWithKeys(keys2, len(keys2))

慕的地6264312

您可以做的是让 QueryWithKeys 方法调用 QueryWithPointerKeys 方法,然后放入一个指向键整数的指针。明显的缺点是处理时间会更长一些。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go