Tidak Boleh Menambahkan pada Struct Slice Di Luar Kaedah
Apabila bekerja dengan slice dalam Go, isu biasa timbul apabila menambahkan pada slice yang sifat sesuatu struct. Dalam senario tertentu, operasi ini mungkin gagal walaupun berfungsi dengan betul apabila dilakukan secara langsung pada struct.
Pertimbangkan contoh berikut:
type Test1 struct { all []int } func (c Test1) run() []int { for i := 0; i < 2; i++ { c.all = append(c.all, i) } return c.all }
Di sini, kod berjaya ditambahkan pada semua kepingan dalam kaedah jalankan struct Test1. Walau bagaimanapun, jika kaedah ini memanggil kaedah lain, operasi tambah gagal.
Contohnya:
type Test3 struct { all []int } func (c Test3) run() []int { c.combo() return c.all } func (c Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) } }
Dalam senario ini, kaedah Test3.combo cuba untuk menambah pada semua kepingan tetapi gagal . Sebab untuk ini ialah Go melepasi nilai mengikut nilai, bermakna salinan struct Test3 dicipta apabila c.combo() dipanggil.
Salinan beroperasi pada kepingannya sendiri, dan apabila kaedah itu kembali, perubahan yang berkaitan dibuang. Oleh itu, apabila Test3.run cuba mengembalikan c.all, ia mengembalikan kepingan kosong kerana versi ubah suai salinan hilang.
Penyelesaian kepada isu ini ialah menggunakan penerima penunjuk untuk kaedah kombo:
func (c *Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) } }
Menggunakan penerima penuding memastikan kaedah tersebut beroperasi pada struct Test3 asal, membenarkan perubahan yang dibuat dalam kaedah kombo dikekalkan apabila ia kembali.
Atas ialah kandungan terperinci Mengapa Penambahan Slice Struktur Tidak Berfungsi Apabila Dipanggil Daripada Kaedah Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!