指向 struct golang 问题的指针片段

Slice of pointers to a struct golang issue

我的存储库层中有一个函数应该 return 一段指针,但代码无法正常工作。

var books []model.Book

func GetBooksByGenre(genre string) []*model.Book {
    var response []*model.Book
    for _, ele := range books {
        if ele.Genre == genre {
            response = append(response, &ele)
        }
    }
    return response
}

我正在尝试遍历书籍列表,最后 return 一段基于匹配输入类型的书籍的 genre 的指针。

我调试后发现问题是由于 ele 得到更新并弄乱了 var response

中的现有指针

问题是,如果按 genre 的顺序插入 3 本书,如 comedythrillerdrama,并且如果 GetBooksByGenre genre 一起调用为 comedythriller,然后输出为 drama,因为这是我迭代列表时的最后一个条目。

我该如何解决这个问题?

程序用变量ele的地址填充切片。一种解决方法是使用切片元素的地址:

func GetBooksByGenre(genre string) []*model.Book {
    var response []*model.Book
    for i, ele := range books {
        if ele.Genre == genre {
            response = append(response, &books[i])
        }
    }
    return response
}

另一个修复方法是将 books 更改为 []*model.Book 而不是 []model.Book。使用此代码进行更改:

func GetBooksByGenre(genre string) []*model.Book {
    var response []*model.Book
    for _, ele := range books {
        if ele.Genre == genre {
            response = append(response, ele)
        }
    }
    return response
}

另一个修复方法是为每次迭代创建一个新变量并使用该变量的地址:

func GetBooksByGenre(genre string) []*model.Book {
    var response []*model.Book
    for _, ele := range books {
        if ele.Genre == genre {
            ele := ele // <-- new variable
            response = append(response, &ele)
        }
    }
    return response
}

您可能想要此处提供的前两个选项之一。