gpt4 book ai didi

go - 更新传递给函数的结构中的 slice

转载 作者:行者123 更新时间:2023-12-01 22:39:39 30 4
gpt4 key购买 nike

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

函数addBookToShelfInLibrary(l * library,shelfid int,b book)-将一个库作为输入,尝试将其添加到书架中,并以id = shelfid(作为参数传递)。该函数将追加到books数组,并将其分配给books数组。我想念什么?

在代码运行结束时,我希望这些书包含两本书,“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)
}
}
}

感谢您提前答复/解释。

最佳答案

在此语句中:

s := range (*l).shelves 

变量 s是slice元素的副本。稍后对append的调用将修改此副本,而不是slice元素。更改代码以修改slice元素:
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{
{
...

所有其他代码保持不变。 Run it on the playground

关于go - 更新传递给函数的结构中的 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59170081/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com