PHP Editor Apple hadir untuk mendedahkan teka-teki tentang penghirisan struktur: Apakah perbezaan antara penghirisan struktur dan penghirisan antara muka yang dilaksanakannya? Dalam bahasa Go, slices ialah struktur data yang mudah dan fleksibel yang boleh menukar saiz secara dinamik. Penghirisan struktur ialah bentuk penghirisan khas, yang menyimpan elemen jenis struktur. Tetapi bagaimana ia berbeza daripada kepingan yang melaksanakan antara muka yang sama? Marilah kita sama-sama mengetahui jawapannya.
Saya mempunyai antara mukaModel
,它是由struct Person
dilaksanakan.
Untuk mendapatkan contoh model, saya mempunyai fungsi pembantu berikut:
func newModel(c string) Model { switch c { case "person": return newPerson() } return nil } func newPerson() *Person { return &Person{} }
Kaedah di atas membolehkan saya mengembalikan contoh Orang dari jenis yang betul (model baharu boleh ditambah dengan mudah kemudian menggunakan kaedah yang sama).
Apabila saya cuba melakukan sesuatu seperti ini untuk mengembalikan kepingan model, saya mendapat ralat. Kod:
func newModels(c string) []Model { switch c { case "person": return newPersons() } return nil } func newPersons() *[]Person { var models []Person return &models }
Pergi mengadu: 无法使用 newPersons()(类型 []Person)作为返回参数中的类型 []Model
Matlamat saya adalah untuk mengembalikan sekeping jenis model yang diminta (tidak kira []Person
、[]FutureModel
、[]Terminator2000
, w/e). Apa yang saya hilang dan bagaimana untuk melaksanakan penyelesaian sedemikian dengan betul?
Ini hampir sama dengan soalan yang baru saya jawab: https://www.php.cn/link/2c029952e202c0e560626a4c5980d64c
Jawapan ringkasnya ialah anda betul. Sekeping struktur tidak sama dengan sekeping antara muka yang dilaksanakan oleh struktur.
[]Person
和 []Model
具有不同的内存布局。这是因为它们所属的类型具有不同的内存布局。 Model
是一个接口值,这意味着在内存中它的大小为两个字。一个词代表类型信息,另一个词代表数据。 Person
是一个结构,其大小取决于它包含的字段。为了从 []Person
转换为 []Model
, anda perlu mengulangi tatasusunan dan taip hantar setiap elemen.
Memandangkan penukaran ini ialah operasi O(n) dan menghasilkan penciptaan kepingan baharu, Go enggan melakukan operasi ini secara tersirat. Anda boleh melakukan ini secara eksplisit menggunakan kod berikut.
models := make([]Model, len(persons)) for i, v := range persons { models[i] = Model(v) } return models
Seperti yang ditunjukkan oleh dskinner, anda berkemungkinan besar memerlukan penunjuk kepada sekeping, bukan penunjuk kepada sekeping. Penunjuk kepada kepingan biasanya tidak diperlukan.
*[]Person // pointer to slice []*Person // slice of pointers
Atas ialah kandungan terperinci Menghiris struktur! =Kepingan antara muka yang dilaksanakannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!