Rumah > pembangunan bahagian belakang > Golang > Menghiris struktur! =Kepingan antara muka yang dilaksanakannya?

Menghiris struktur! =Kepingan antara muka yang dilaksanakannya?

PHPz
Lepaskan: 2024-02-09 13:03:08
ke hadapan
436 orang telah melayarinya

Menghiris struktur! =Kepingan antara muka yang dilaksanakannya?

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.

Kandungan soalan

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

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

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?

Penyelesaian

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

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

Atas ialah kandungan terperinci Menghiris struktur! =Kepingan antara muka yang dilaksanakannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan