Jadual Kandungan
Kandungan soalan
解决方法
Rumah pembangunan bahagian belakang Golang Buat contoh jenis generik menggunakan penunjuk kepada parameter jenis

Buat contoh jenis generik menggunakan penunjuk kepada parameter jenis

Feb 09, 2024 pm 01:57 PM

Buat contoh jenis generik menggunakan penunjuk kepada parameter jenis

editor php Yuzai akan memperkenalkan dalam artikel ini cara menggunakan penunjuk untuk menaip parameter untuk mencipta contoh jenis generik. Generik ialah konsep yang digunakan secara meluas dalam pengaturcaraan yang membolehkan kita menulis kod umum tanpa menyatakan jenis tertentu. Dalam PHP, walaupun tiada sokongan asli untuk generik, kita boleh mensimulasikan generik dengan menggunakan penunjuk untuk menaip parameter. Kaedah ini boleh menjadikan kita lebih fleksibel dan cekap semasa menulis kod, dan meningkatkan kebolehgunaan semula dan kebolehselenggaraan kod. Dalam kandungan berikut, kami akan memperincikan cara menggunakan kaedah ini untuk mencipta contoh jenis generik dan memberikan beberapa contoh aplikasi praktikal.

Kandungan soalan

Memandangkan takrif jenis ini:

type n interface{ ~int | ~float32 | ~float64 }

type s[t any] struct {
    t t
}

type myint int

type pspmyint[t myint] *s[*t]
type spmyint[t *myint,] s[t]
type spmyint2[t myint] s[*t]
Salin selepas log masuk

Saya boleh mencipta var daripada type pspmyint

func createps[t myint]() pspmyint[t] {
    var i t
    s := s[*t]{t: &i}
    return &s
}
Salin selepas log masuk

Tetapi saya tidak tahu bagaimana untuk mencipta pembolehubah spmyintspmyint2.

Ini

func createSP[T myInt]() spMyInt2[T] {
    var i T
    s := S[*T]{t: &i}
    return s
}
Salin selepas log masuk

Kompilasi gagal Anda tidak boleh menggunakan s (pembolehubah jenis s[*t]) sebagai taip spmyint2[t] dalam pernyataan pulangan. 不能在return语句中使用s(s[*t]类型的变量)作为spmyint2[t]类型。

解决方法

首先,不要使用精确类型参数约束。这几乎没有任何意义。当您将函数声明为 createps[t myint]() 时,类型参数类型集的基数为 1,因此可以有效地由 myintPenyelesaianPertama sekali, Jangan gunakan kekangan parameter jenis tepat. Ini hampir tidak masuk akal. Apabila anda mengisytiharkan fungsi sebagai createps[t myint](), set jenis parameter mempunyai kardinaliti 1, jadi ia boleh digunakan secara berkesan oleh myint sahaja

dan

Selamanya

. Anda boleh menulis semula fungsi seperti ini:

65bee32705632 s[*t] spmyint2[t] 不同。但是,由于 spmyint2[t] 的底层类型是 s[*t]Penyelesaian masalah ini:

Taip s[*t] type spmyint[t *myint,] s[t] berbeza

daripada spmyint2[t]. Walau bagaimanapun, memandangkan jenis asas spmyint2[t] ialah s[*t], anda hanya boleh menukar:

65bee32705638 Bagi (di mana koma bukan kesilapan menaip tetapi diperlukan untuk mengelakkan kekaburan penghuraian), perkara tidak semudah itu.

Masalahnya ialah parameter jenis spmyint[t *myint] 有一个类型参数约束为 *myint 并且函数 t 受基本类型 myint 约束,因此 *t 应该满足 phpcnc phpcnt * myint。这是不正确的,因为类型文字 *t 不等于 *myint 的明显不明显的原因。所以实际上你不能为 type spmyint[t *myint,] s[t] bukan

kekangan jenisnya. Oleh itu, jenis literal tidak boleh digunakan untuk membuat instantiate jenis literal tidak bernama yang berbeza. Untuk lebih jelas:

// naive attempt that doesn't compile
func createsp1[t myint]() spmyint[*t] {
    var i t
    s := s[*t]{t: &i}
    return spmyint[*t](s)
}
Salin selepas log masuk

Anda mungkin berfikir bahawa spmyint[t *myint] mempunyai parameter jenis yang terhad kepada *myint dan fungsi t terikat oleh pangkalan taipkan kekangan myint, oleh itu *t hendaklah memenuhi phpcnc phpcnt * myint. Ini tidak betul, atas sebab yang nampaknya tidak jelas, jenis literal *t tidak sama dengan *myint. Jadi sebenarnya anda tidak boleh menulis pembina universal untuk 🎜 . 🎜 🎜Tetapi anda bernasib baik, kerana kekangan jenis mempunyai kardinaliti satu. Jadi anda boleh mengalih keluar parameter jenis: 🎜
func createSP1() spMyInt[*myInt] {
    var i myInt
    s := S[*myInt]{t: &i}
    return spMyInt[*myInt](s)
}
Salin selepas log masuk

Atas ialah kandungan terperinci Buat contoh jenis generik menggunakan penunjuk kepada parameter jenis. 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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat 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)

Apakah kelemahan debian openssl Apakah kelemahan debian openssl Apr 02, 2025 am 07:30 AM

OpenSSL, sebagai perpustakaan sumber terbuka yang digunakan secara meluas dalam komunikasi yang selamat, menyediakan algoritma penyulitan, kunci dan fungsi pengurusan sijil. Walau bagaimanapun, terdapat beberapa kelemahan keselamatan yang diketahui dalam versi sejarahnya, yang sebahagiannya sangat berbahaya. Artikel ini akan memberi tumpuan kepada kelemahan umum dan langkah -langkah tindak balas untuk OpenSSL dalam sistem Debian. Debianopenssl yang dikenal pasti: OpenSSL telah mengalami beberapa kelemahan yang serius, seperti: Kerentanan Pendarahan Jantung (CVE-2014-0160): Kelemahan ini mempengaruhi OpenSSL 1.0.1 hingga 1.0.1f dan 1.0.2 hingga 1.0.2 versi beta. Penyerang boleh menggunakan kelemahan ini untuk maklumat sensitif baca yang tidak dibenarkan di pelayan, termasuk kunci penyulitan, dll.

Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO? Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO? Mar 21, 2025 pm 06:37 PM

Artikel ini menerangkan cara menggunakan alat PPROF untuk menganalisis prestasi GO, termasuk membolehkan profil, mengumpul data, dan mengenal pasti kesesakan biasa seperti CPU dan isu memori.

Bagaimana anda menulis ujian unit di GO? Bagaimana anda menulis ujian unit di GO? Mar 21, 2025 pm 06:34 PM

Artikel ini membincangkan ujian unit menulis di GO, meliputi amalan terbaik, teknik mengejek, dan alat untuk pengurusan ujian yang cekap.

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Artikel ini menunjukkan penciptaan dan stub di GO untuk ujian unit. Ia menekankan penggunaan antara muka, menyediakan contoh pelaksanaan mengejek, dan membincangkan amalan terbaik seperti menjaga mocks fokus dan menggunakan perpustakaan penegasan. Articl

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

Artikel ini meneroka kekangan jenis adat Go untuk generik. Ia memperincikan bagaimana antara muka menentukan keperluan jenis minimum untuk fungsi generik, meningkatkan keselamatan jenis dan kebolehgunaan semula kod. Artikel ini juga membincangkan batasan dan amalan terbaik

Terangkan tujuan Pakej Refleksi Go. Bilakah anda akan menggunakan refleksi? Apakah implikasi prestasi? Terangkan tujuan Pakej Refleksi Go. Bilakah anda akan menggunakan refleksi? Apakah implikasi prestasi? Mar 25, 2025 am 11:17 AM

Artikel ini membincangkan pakej GO's Reflect, yang digunakan untuk manipulasi kod runtime, bermanfaat untuk siri, pengaturcaraan generik, dan banyak lagi. Ia memberi amaran tentang kos prestasi seperti pelaksanaan yang lebih perlahan dan penggunaan memori yang lebih tinggi, menasihati penggunaan yang bijak dan terbaik

Bagaimana anda menggunakan ujian yang didorong oleh jadual di GO? Bagaimana anda menggunakan ujian yang didorong oleh jadual di GO? Mar 21, 2025 pm 06:35 PM

Artikel ini membincangkan menggunakan ujian yang didorong oleh jadual di GO, satu kaedah yang menggunakan jadual kes ujian untuk menguji fungsi dengan pelbagai input dan hasil. Ia menyoroti faedah seperti kebolehbacaan yang lebih baik, penurunan duplikasi, skalabiliti, konsistensi, dan a

Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Apr 02, 2025 pm 02:06 PM

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

See all articles