Bagaimana Mengendalikan Jenis Terkandas sebagai Argumen dalam Go 1.18 Generik?

Susan Sarandon
Lepaskan: 2024-10-27 08:08:31
asal
312 orang telah melayarinya

How to Handle Constrained Types as Arguments in Go 1.18 Generics?

Menggunakan Jenis Terkandas sebagai Argumen dalam Go 1.18

Dalam Go 1.18 generik, jenis terhalang membenarkan pembangun mentakrifkan jenis data tersuai dengan kekangan tertentu. Walau bagaimanapun, apabila menggunakan jenis terkekang sebagai hujah kepada fungsi yang mengharapkan jenis konkrit, penukaran jenis diperlukan.

Pertimbangkan contoh berikut:

<code class="go">type Pokemon interface {
    ReceiveDamage(float64)
    InflictDamage(Pokemon)
}

type Float interface {
    float32 | float64
}

type Charmander[F Float] struct {
    Health      F
    AttackPower F
}</code>
Salin selepas log masuk

Di sini, Charmander melaksanakan antara muka Pokemon dengan generik taip parameter F yang boleh digunakan sama ada dengan float32 atau float64. Walau bagaimanapun, percubaan untuk menggunakan AttackPower (jenis terkekang) sebagai argumen float64 dalam lain.ReceiveDamage() mengakibatkan ralat:

<code class="go">func (c *Charmander[float64]) InflictDamage(other Pokemon) {
    other.ReceiveDamage(c.AttackPower)
}</code>
Salin selepas log masuk

Penukaran Jenis untuk Keserasian

Untuk menyelesaikan isu ini, penukaran jenis mesti digunakan untuk memastikan keserasian antara jenis terkekang dan jenis konkrit yang diharapkan oleh fungsi. Ini kerana F tidak bersamaan dengan float64 walaupun dikekang kepada float64.

Kod yang diperbetulkan menjadi:

<code class="go">func (c *Charmander[T]) InflictDamage(other Pokemon) {
    other.ReceiveDamage(float64(c.AttackPower))
}</code>
Salin selepas log masuk

Begitu juga, kaedah ReceiveDamage() diubah suai untuk mengendalikan jenis yang dikekang ( Kesihatan) dengan menukar hujah kerosakan kepada jenis terkurung:

<code class="go">func (c *Charmander[T]) ReceiveDamage(damage float64) {
    c.Health -= T(damage)
}</code>
Salin selepas log masuk

Pertimbangan Ketepatan

Adalah penting untuk ambil perhatian bahawa penukaran daripada float64 kepada float32 (apabila F adalah instantiated dengan float32) boleh mengakibatkan kehilangan ketepatan. Ini mungkin perlu dipertimbangkan dalam kes penggunaan tertentu.

Atas ialah kandungan terperinci Bagaimana Mengendalikan Jenis Terkandas sebagai Argumen dalam Go 1.18 Generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!