猿问

Go - 附加到结构中的切片

我正在尝试实现 2 个简单的结构,如下所示:


package main


import (

    "fmt"

)


type MyBoxItem struct {

    Name string

}


type MyBox struct {

    Items []MyBoxItem

}


func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem {

    return append(box.Items, item)

}


func main() {


    item1 := MyBoxItem{Name: "Test Item 1"}

    item2 := MyBoxItem{Name: "Test Item 2"}


    items := []MyBoxItem{}

    box := MyBox{items}


    AddItem(box, item1)  // This is where i am stuck


    fmt.Println(len(box.Items))

}

我究竟做错了什么?我只想在框结构上调用 addItem 方法并传入一个项目


狐的传说
浏览 205回答 3
3回答

有只小跳蛙

嗯...这是人们在 Go 中附加到切片时最常见的错误。您必须将结果分配回切片。func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem {    box.Items = append(box.Items, item)    return box.Items}此外,您已经定义AddItem了*MyBox类型,因此将此方法称为box.AddItem(item1)

守着一只汪

package mainimport (        "fmt")type MyBoxItem struct {        Name string}type MyBox struct {        Items []MyBoxItem}func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem {        box.Items = append(box.Items, item)        return box.Items}func main() {        item1 := MyBoxItem{Name: "Test Item 1"}        items := []MyBoxItem{}        box := MyBox{items}        box.AddItem(item1)        fmt.Println(len(box.Items))}输出:1

Qyouu

虽然这两个答案都很好。还有两个变化可以做,摆脱 return 语句,因为该方法被调用以获取指向结构的指针,因此切片会自动修改。无需初始化空切片并将其分配给结构    package main        import (        "fmt"    )    type MyBoxItem struct {        Name string    }    type MyBox struct {        Items []MyBoxItem    }    func (box *MyBox) AddItem(item MyBoxItem) {        box.Items = append(box.Items, item)    }    func main() {        item1 := MyBoxItem{Name: "Test Item 1"}        item2 := MyBoxItem{Name: "Test Item 2"}        box := MyBox{}        box.AddItem(item1)        box.AddItem(item2)        // checking the output        fmt.Println(len(box.Items))        fmt.Println(box.Items)    }
随时随地看视频慕课网APP

相关分类

Go
我要回答