为了账号安全,请及时绑定邮箱和手机立即绑定

指向结构戈朗问题的指针切片

指向结构戈朗问题的指针切片

Go
叮当猫咪 2022-09-12 16:40:11
我的存储库层中有一个函数,它应该返回一段指针,但代码无法正常工作。var books []model.Bookfunc GetBooksByGenre(genre string) []*model.Book {    var response []*model.Book    for _, ele := range books {        if ele.Genre == genre {            response = append(response, &ele)        }    }    return response}我正在尝试迭代书籍列表,并最终根据与输入类型匹配的书籍返回一段指针。genre我调试并发现由于更新并弄乱var中的现有指针而存在问题eleresponse问题是,如果以 as 的顺序插入了 3 本书,并且如果 GetBooksByGenre 用 as 或 调用,则输出将作为我迭代列表时的最后一个条目。genrecomedythrillerdramagenrecomedythrillerdrama如何解决此问题?
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

程序用变量 的地址填充切片。一种解决方法是使用切片元素的地址: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

}

您可能希望在此处介绍前两个选项之一。


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信