Jadual Kandungan
Kandungan soalan
Penyelesaian
Rumah pembangunan bahagian belakang Golang Menghiris struktur! =Kepingan antara muka yang dilaksanakannya?

Menghiris struktur! =Kepingan antara muka yang dilaksanakannya?

Feb 09, 2024 pm 01:03 PM
pergi bahasa overflow

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!

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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Harga Bitcoin sejak kelahirannya 2009-2025 Ringkasan paling lengkap harga sejarah BTC Harga Bitcoin sejak kelahirannya 2009-2025 Ringkasan paling lengkap harga sejarah BTC Jan 15, 2025 pm 08:11 PM

Harga Bitcoin sejak kelahirannya 2009-2025 Ringkasan paling lengkap harga sejarah BTC

Perkara yang perlu dilakukan jika masa di sudut kanan bawah Windows 11 hilang_Apa yang perlu dilakukan jika masa di sudut kanan bawah Windows 11 hilang Perkara yang perlu dilakukan jika masa di sudut kanan bawah Windows 11 hilang_Apa yang perlu dilakukan jika masa di sudut kanan bawah Windows 11 hilang May 06, 2024 pm 01:20 PM

Perkara yang perlu dilakukan jika masa di sudut kanan bawah Windows 11 hilang_Apa yang perlu dilakukan jika masa di sudut kanan bawah Windows 11 hilang

Bagaimana untuk menggunakan kod orang lain dalam python Bagaimana untuk menggunakan kod orang lain dalam python May 05, 2024 pm 07:54 PM

Bagaimana untuk menggunakan kod orang lain dalam python

Perbezaan antara ujian prestasi dan ujian unit dalam bahasa Go Perbezaan antara ujian prestasi dan ujian unit dalam bahasa Go May 08, 2024 pm 03:09 PM

Perbezaan antara ujian prestasi dan ujian unit dalam bahasa Go

Apakah perangkap yang perlu kita perhatikan semasa mereka bentuk sistem teragih dengan teknologi Golang? Apakah perangkap yang perlu kita perhatikan semasa mereka bentuk sistem teragih dengan teknologi Golang? May 07, 2024 pm 12:39 PM

Apakah perangkap yang perlu kita perhatikan semasa mereka bentuk sistem teragih dengan teknologi Golang?

Perpustakaan dan alatan teknologi Golang yang digunakan dalam pembelajaran mesin Perpustakaan dan alatan teknologi Golang yang digunakan dalam pembelajaran mesin May 08, 2024 pm 09:42 PM

Perpustakaan dan alatan teknologi Golang yang digunakan dalam pembelajaran mesin

Apakah teknik penyahpepijatan untuk panggilan rekursif dalam fungsi Java? Apakah teknik penyahpepijatan untuk panggilan rekursif dalam fungsi Java? May 05, 2024 am 10:48 AM

Apakah teknik penyahpepijatan untuk panggilan rekursif dalam fungsi Java?

Peranan teknologi Golang dalam pembangunan IoT mudah alih Peranan teknologi Golang dalam pembangunan IoT mudah alih May 09, 2024 pm 03:51 PM

Peranan teknologi Golang dalam pembangunan IoT mudah alih

See all articles