指向structgolang问题的指针切片

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

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
}

我正在尝试遍历书籍列表,最后根据genre与输入类型匹配的书籍的 返回一段指针。

我调试并发现问题是由于ele更新并弄乱了 var 中的现有指针response

问题是,如果按genreas的顺序插入了 3 本书comedythriller并且drama如果使用as或调用GetBooksByGenre,则输出将作为我迭代列表时的最后一个条目。genrecomedythrillerdrama

我该如何解决这个问题?

回答

程序用变量的地址填充切片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为 a[]*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
}

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


以上是指向structgolang问题的指针切片的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>