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

Go - 附加到结构中的切片

Go - 附加到结构中的切片

Go
狐的传说 2021-06-18 22:01:09
我正在尝试实现 2 个简单的结构,如下所示:package mainimport (    "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 方法并传入一个项目
查看完整描述

3 回答

?
有只小跳蛙

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

嗯...这是人们在 Go 中附加到切片时最常见的错误。您必须将结果分配回切片。


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

    box.Items = append(box.Items, item)

    return box.Items

}

此外,您已经定义AddItem了*MyBox类型,因此将此方法称为box.AddItem(item1)


查看完整回答
反对 回复 2021-06-21
?
守着一只汪

TA贡献1872条经验 获得超3个赞

package main


import (

        "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


查看完整回答
反对 回复 2021-06-21
?
Qyouu

TA贡献1786条经验 获得超11个赞

虽然这两个答案都很好。还有两个变化可以做,


摆脱 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)

    }


查看完整回答
反对 回复 2021-06-21
  • 3 回答
  • 0 关注
  • 204 浏览
慕课专栏
更多

添加回答

举报

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