Memanfaatkan generik untuk kod go yang boleh diguna semula dan selamat
Sebelum GO 1.18, mencapai kebolehgunaan semula kod yang sering terlibat menggunakan antara muka, yang, walaupun berkuasa, boleh membawa kepada keselamatan jenis yang kurang dan ralat runtime yang berpotensi. Generik menawarkan penyelesaian yang lebih elegan. Mereka membolehkan anda menulis fungsi dan struktur data yang boleh beroperasi pada pelbagai jenis tanpa mengorbankan keselamatan jenis. Ini dicapai melalui penggunaan parameter jenis, yang dilambangkan oleh kurungan persegi []
.
Mari kita gambarkan dengan contoh mudah: fungsi untuk mencari elemen maksimum dalam kepingan. Tanpa generik, anda perlu menulis fungsi berasingan untuk jenis yang berbeza (misalnya, MaxInt
, MaxFloat64
, dll.). Dengan generik, anda boleh menulis satu fungsi:
Perhatikan bahagian [T constraints.Ordered]
. Ini mengisytiharkan parameter jenis T
dikekang kepada jenis yang melaksanakan constraints.Ordered
Antara muka yang ditetapkan (ditakrifkan dalam pakej constraints
yang diperkenalkan di GO 1.18). Ini memastikan bahawa hanya jenis setanding yang boleh digunakan dengan fungsi Max
, mencegah kesilapan runtime. Kekangan ini menguatkuasakan keselamatan jenis pada masa penyusunan. Jika anda cuba menggunakan Max
dengan jenis yang tidak memuaskan constraints.Ordered
, pengkompil akan mengeluarkan ralat. Ini adalah peningkatan yang ketara ke atas pergantungan sebelumnya pada antara muka yang hanya diperiksa pada runtime. Anda boleh membuat kekangan tersuai anda sendiri juga untuk menentukan keperluan jenis khusus anda.
Kelebihan utama generik di mana
Pengenalan Generik dalam GO 1.18 membawa beberapa penambahbaikan penting berbanding versi sebelumnya:
Pelaksanaan generik struktur data GO biasa
Banyak struktur data GO biasa sangat mendapat manfaat daripada pelaksanaan generik:
Stack
: Stack boleh dilaksanakan secara umum untuk menyimpan unsur -unsur jenis apa pun, memastikan keselamatan jenis dan mengelakkan keperluan untuk penegasan jenis.Queue
: Sama seperti timbunan, giliran generik membolehkan penyimpanan unsur -unsur mana -mana jenis sambil mengekalkan keselamatan jenis.List
(senarai yang dipautkan): Senarai yang dipautkan boleh dibuat generik, membolehkan anda menyimpan nod yang mengandungi unsur -unsur pelbagai jenis.Map
(sudah generik): Walaupun map
terbina dalam Go sudah agak generik (ia boleh menyimpan nilai-nilai mana-mana jenis), jenis utama juga parameter, menjadikannya generik secara semulajadi. Walau bagaimanapun, batasan peta (contohnya, tidak menyokong jenis tersuai untuk kekunci melainkan mereka melaksanakan pengendali kesamaan) menyerlahkan keperluan untuk keupayaan yang lebih kuat dari generik yang diisytiharkan secara eksplisit.Tree
(contohnya, pokok carian binari): Pokok generik membolehkan anda menyimpan nod dengan nilai pelbagai jenis sambil mengekalkan struktur dan sifat pokok.Set
: Pelaksanaan set generik membolehkan penyimpanan unsur-unsur dari mana-mana jenis setanding, menawarkan cara yang selamat untuk menguruskan koleksi unsur-unsur unik. Melaksanakan struktur data ini secara umum mengurangkan duplikasi kod dan meningkatkan kebolehlaksanaan dengan ketara. Sebagai contoh, pelaksanaan Stack
generik mungkin kelihatan seperti ini:
Pengendalian kekangan dan jenis parameter yang berkesan
Penggunaan kekangan dan jenis parameter yang berkesan adalah penting untuk menulis kod generik yang mantap dan boleh diguna semula di GO.
constraints
menyediakan kekangan yang telah ditetapkan seperti Ordered
, Integer
, Float
, dan lain-lain. Anda juga boleh menentukan kekangan tersuai anda sendiri menggunakan antara muka.[]
mengikuti fungsi atau nama jenis. Mereka mewakili jenis yang boleh digunakan dengan kod generik. Fungsi PrintValue
ini hanya akan menerima jenis yang melaksanakan antara muka Stringer
.
T int | string
). Walau bagaimanapun, anda boleh mensimulasikan ini menggunakan antara muka. Sebagai contoh, jika anda memerlukan fungsi untuk mengendalikan sama ada int
atau nilai string
, anda boleh menentukan antara muka yang kedua -dua jenis memuaskan.Dengan berhati-hati memilih dan menentukan kekangan dan jenis parameter, anda boleh membuat kod generik yang fleksibel, jenis selamat, dan sangat boleh diguna semula di GO. Ingatlah untuk mempertimbangkan kekangan yang diperlukan untuk memastikan kedua -dua fleksibiliti dan keselamatan dalam fungsi generik dan struktur data anda.
Atas ialah kandungan terperinci Bagaimanakah saya menggunakan generik untuk menulis lebih banyak kod yang boleh diguna semula dan selamat di GO? (Dengan asumsi Go 1.18). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!