


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]
Saya boleh mencipta var daripada type pspmyint
func createps[t myint]() pspmyint[t] { var i t s := s[*t]{t: &i} return &s }
Tetapi saya tidak tahu bagaimana untuk mencipta pembolehubah spmyint
或 spmyint2
.
Ini
func createSP[T myInt]() spMyInt2[T] { var i T s := S[*T]{t: &i} return s }
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,因此可以有效地由 myint
PenyelesaianPertama 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
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
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
// naive attempt that doesn't compile func createsp1[t myint]() spmyint[*t] { var i t s := s[*t]{t: &i} return spmyint[*t](s) }
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) }
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Artikel ini menerangkan mekanisme import pakej Go: Dinamakan import (mis., Import & quot; fmt & quot;) dan import kosong (mis., Import _ & quot; fmt & quot;). Dinamakan import membuat kandungan pakej boleh diakses, sementara import kosong hanya melaksanakan t

Artikel ini memperincikan penukaran yang cekap hasil pertanyaan MySQL ke dalam kepingan struct go. Ia menekankan menggunakan kaedah imbasan pangkalan data/SQL untuk prestasi optimum, mengelakkan parsing manual. Amalan terbaik untuk pemetaan medan struct menggunakan tag db dan robus

Artikel ini menerangkan fungsi Newflash () Beego untuk pemindahan data antara halaman dalam aplikasi web. Ia memberi tumpuan kepada menggunakan NewFlash () untuk memaparkan mesej sementara (kejayaan, kesilapan, amaran) antara pengawal, memanfaatkan mekanisme sesi. Limita

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

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

Artikel ini memperincikan penulisan fail yang cekap di GO, membandingkan OS.WriteFile (sesuai untuk fail kecil) dengan os.openfile dan buffered menulis (optimum untuk fail besar). Ia menekankan pengendalian ralat yang teguh, menggunakan penangguhan, dan memeriksa kesilapan tertentu.

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

Artikel ini meneroka menggunakan alat pengesanan untuk menganalisis aliran pelaksanaan aplikasi GO. Ia membincangkan teknik instrumentasi manual dan automatik, membandingkan alat seperti Jaeger, Zipkin, dan OpenTelemetry, dan menonjolkan visualisasi data yang berkesan
