繁体   English   中英

golang追加到struct里面的一个切片

[英]golang append to a slice inside struct

我试图理解如何操纵Go中的数据结构及其指针方法(带有副本或引用)。

我的代码在Go Playground,在这里: https//play.golang.org/p/j_06RS5Xcz

我制作了一个结构切片的地图,里面还有一片其他东西。

这里:

type Item struct {
    Name        string
    Description string
}

type Entity struct {
    Base   Item
    Others []Item
}

var database map[int][]Entity

func main() {
    database = make(map[int][]Entity)
    database[1] = []Entity{}

    e1 := Entity{}
    e1.Base = Item{"A", "aaa"}
    e1.Others = []Item{}

    database[1] = append(database[1], e1)

    // later, I want to add other items to my entity
    e1.Others = append(e1.Others, Item{"B", "bbb"})

    // other items field is empty
    fmt.Println(database)
}

// prints: map[1:[{{A aaa} []}]]

我想在我的程序中稍后添加其他项目。 似乎我必须使用指针来解决这个问题,但我不知道如何解决。

我的实体应该是这样吗?

type Entity struct {
    Base   Item
    Others *[]Item
}

如果是这样,我应该如何追加物品呢? 像这样?

*e1.Others = append(*e1.Others, Item{"B", "bbb"})

如果还有其他问题的空间...我也不清楚我是否必须这样做: database[1] = []Entity{}database[1] = append(database[1], e1)我可以在这种情况下附加。 我在e1.Others = []Item{}上尝试过相同的但是它没有产生相同的追加效果(我知道这是我的误解,而不是Go的错误)。

提前致谢 :)

在当前代码中,您有两个Entity类型的对象。 一个名为e1 ,另一个名为database[1] 这两个对象是完全独立的,因为它们是struct 因此,当您更改其中一个时,它不会影响另一个。 (小例外:对Items字段的一些更改将被共享,但不是全部。)

如果您想首先将实体添加到地图并稍后修改它,您应该使用指针map[int][]*Entity 然后,您应该创建一个指向实体的指针,而不是Entity{} ,使用e1 := &Entity{} ,然后程序将起作用。 e1.Others的更改也会影响database[1].Others ,因为这两个变量现在指向同一个对象。

但是print声明会有所不同。 它不会打印结构,而只会打印指针值。 要解决此问题,请添加String方法:

func (e *Entity) String() string { return fmt.Sprint(*e) }

请参阅https://play.golang.org/p/edU7E5Gnjw ,其中我还删除了不必要的空切片。 附加到nil切片是完全可以的。

为了进一步阅读,我建议http://research.swtch.com/godata ,它将回答您目前的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM