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

更新传递给函数的结构中的切片

更新传递给函数的结构中的切片

Go
明月笑刀无情 2022-04-20 20:42:25
需要帮助了解如何更新包含在结构中并传递给函数的切片。函数 addBookToShelfInLibrary(l *library,shelfid int, b book) - 将图书馆作为输入,尝试将书籍添加到 id = shelfid 的书架(作为参数传递)。该函数附加到书籍数组并将其分配给书籍数组。我错过了什么?在代码运行结束时,我希望这些书包含两本书,“harrypotter”,“bible”,但我只看到一本书,即 harrypotter。另外,我正在传递一个指向库的指针,但我认为在这种情况下这并不重要。操场代码:- https://play.golang.org/p/JrjtLSj-jHIfunc main() {    lib := library{        shelves: []shelf{            {                id: 1,                books: []book{                    {name: "harrypotter"},                },            },        },    }    addBookToShelfInLibrary(&lib, 1, book{name: "bible"})    fmt.Printf("%v", lib)}type library struct {    shelves []shelf}type shelf struct {    id    int    books []book}type book struct {    name string}func addBookToShelfInLibrary(l *library, shelfid int, b book) {    for _, s := range (*l).shelves {        if s.id == shelfid {            //found shelf, add book            s.books = append(s.books, b)        }    }}
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

在本声明中:


s := range (*l).shelves 

该变量s是切片元素的副本。稍后对 append 的调用会修改此副本,即非切片元素。更改代码以修改切片元素:


func addBookToShelfInLibrary(l *library, shelfid int, b book) {

    for i := range l.shelves {

        s := &l.shelves[i]

        if s.id == shelfid {

            //found shelf, add book

            s.books = append(s.books, b)

        }

    }

}

另一种方法是使用指向架子的指针:


type library struct {

    shelves []*shelf

}


lib := library{

    shelves: []*shelf{

        {

 ...

所有其他代码保持不变。


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

添加回答

举报

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