簡體   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