需要帮助了解如何更新包含在结构中并传递给函数的切片。函数 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{
{
...
所有其他代码保持不变。
- 1 回答
- 0 关注
- 94 浏览
添加回答
举报
0/150
提交
取消