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

需要帮助了解如何更新包含在结构中并传递给函数的切片。


函数 addBookToShelfInLibrary(l *library,shelfid int, b book) - 将图书馆作为输入,尝试将书籍添加到 id = shelfid 的书架(作为参数传递)。该函数附加到书籍数组并将其分配给书籍数组。我错过了什么?


在代码运行结束时,我希望这些书包含两本书,“harrypotter”,“bible”,但我只看到一本书,即 harrypotter。另外,我正在传递一个指向库的指针,但我认为在这种情况下这并不重要。


操场代码:- https://play.golang.org/p/JrjtLSj-jHI


func 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)

        }

    }

}


明月笑刀无情
浏览 95回答 1
1回答

www说

在本声明中: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{        { ...所有其他代码保持不变。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go