Rumah > pembangunan bahagian belakang > Golang > Mengapa Penambahan pada Slice dalam Go Struct Tidak Berfungsi Tanpa Penugasan Semula?

Mengapa Penambahan pada Slice dalam Go Struct Tidak Berfungsi Tanpa Penugasan Semula?

Susan Sarandon
Lepaskan: 2024-12-14 09:34:14
asal
419 orang telah melayarinya

Why Doesn't Appending to a Slice in a Go Struct Work Without Reassignment?

Go - tambahkan ke slice dalam struct

Dalam Go, apabila cuba menambah kepingan dalam struct, kesilapan yang paling biasa ialah gagal memberikan keputusan kembali kepada kepingan.

Pertimbangkan perkara berikut contoh:

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
}
Salin selepas log masuk

Fungsi AddItem mengambil MyBoxItem dan menambahkannya pada kepingan Item dalam struct MyBox. Ia mengembalikan kepingan yang dikemas kini.

Kini, fungsi utama:

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

items := []MyBoxItem{}
box := MyBox{items}

AddItem(box, item1)  // Attempt to add item without fixing assignment

fmt.Println(len(box.Items))
Salin selepas log masuk

Kod ini cuba memanggil kaedah AddItem pada struct kotak dan lulus item1. Walau bagaimanapun, ia gagal untuk memberikan hasil kembali ke kotak. Potongan item.

Untuk membetulkannya, kod harus diubah suai seperti berikut:

func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem {
    box.Items = append(box.Items, item)
    return box.Items
}
Salin selepas log masuk

Selain itu, kerana fungsi AddItem ialah ditakrifkan untuk *jenis MyBox, ia harus dipanggil sebagai box.AddItem(item1).

Atas ialah kandungan terperinci Mengapa Penambahan pada Slice dalam Go Struct Tidak Berfungsi Tanpa Penugasan Semula?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan