Go - Menambah pada Slice dalam Struct
Dalam Go, menambahkan hirisan dalam struct memerlukan perhatian yang teliti terhadap rujukan berubah-ubah. Ini boleh menjadi mengelirukan apabila bekerja dengan kepingan dalam struct, terutamanya apabila kaedah menerima struct ialah penerima penunjuk.
Masalah
Pertimbangkan kod berikut:
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"} box := MyBox{[]MyBoxItem{}} // Initialize box with an empty slice AddItem(box, item1) // This is where the problem arises fmt.Println(len(box.Items)) }
Isu timbul dalam panggilan ke kaedah AddItem. Apabila memanggil kaedah sebagai AddItem(box, item1), bukannya box.AddItem(item1), salinan baharu bagi struct box dibuat dan bukannya mengubah suai yang asal.
Penyelesaian
Untuk menyelesaikan masalah ini, tetapkan hasil kaedah AddItem kembali ke kepingan asal dalam struct:
func (box *MyBox) AddItem(item MyBoxItem) { box.Items = append(box.Items, item) }
Dengan melakukan ini, perubahan yang dibuat pada kepingan dalam kaedah AddItem ditunjukkan dalam medan kepingan asal struct.
Fungsi Utama yang disemak
Dengan kaedah AddItem yang dikemas kini, fungsi utama yang diperbetulkan seharusnya jadi:
func main() { item1 := MyBoxItem{Name: "Test Item 1"} box := MyBox{[]MyBoxItem{}} box.AddItem(item1) // Call the method correctly fmt.Println(len(box.Items)) }
Kini, output akan mencetak dengan betul panjang kepingan Item, yang sepatutnya 1 selepas menambah item.
Atas ialah kandungan terperinci Bagaimana untuk Menambah dengan Betul pada Slice dalam Go Struct?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!