指向 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 本书,如 comedy
、thriller
和 drama
,并且如果 GetBooksByGenre 与 genre
一起调用为 comedy
或 thriller
,然后输出为 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
}
您可能想要此处提供的前两个选项之一。
我的存储库层中有一个函数应该 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 本书,如 comedy
、thriller
和 drama
,并且如果 GetBooksByGenre 与 genre
一起调用为 comedy
或 thriller
,然后输出为 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
}
您可能想要此处提供的前两个选项之一。