Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Meluluskan Jenis Terkekang sebagai Argumen Fungsi dalam Go 1.18 Generik?

Bagaimana untuk Meluluskan Jenis Terkekang sebagai Argumen Fungsi dalam Go 1.18 Generik?

Linda Hamilton
Linda Hamiltonasal
2024-10-27 04:33:30164semak imbas

How to Pass Constrained Types as Function Arguments in Go 1.18 Generics?

Mengendalikan Jenis Terkandas sebagai Argumen Fungsi dalam Go 1.18 Generik

Go 1.18 memperkenalkan generik, membenarkan pembangun mencipta fungsi dan jenis yang beroperasi secara sewenang-wenangnya jenis data. Walau bagaimanapun, apabila cuba menghantar jenis terkekang sebagai hujah kepada fungsi yang menjangkakan jenis konkrit, pengkompil mungkin menimbulkan ralat.

Untuk menggambarkan isu ini, 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>

Di sini, Charmander melaksanakan antara muka Pokemon dan menerima parameter jenis generik F yang mestilah sama ada float32 atau float64.

<code class="go">func (c *Charmander[float64]) ReceiveDamage(damage float64) {
    c.Health -= damage
}

func (c *Charmander[float64]) InflictDamage(other Pokemon) {
    other.ReceiveDamage(c.AttackPower)
}</code>

Walau bagaimanapun, pengkompil menimbulkan ralat dalam kaedah InflictDamage, menyatakan bahawa c. AttackPower tidak boleh digunakan sebagai argumen float64 untuk fungsi yang lain.ReceiveDamage. Ini kerana, walaupun membuat instance struct Charmander sebagai *Charmander[float64], pengkompil masih menganggap AttackPower sebagai jenis F.

Penyelesaian kepada isu ini terletak pada penggunaan penukaran jenis. ReceiveDamage menjangkakan float64, tetapi AttackPower masih terhad kepada F. Oleh itu, kita perlu menukar AttackPower kepada float64:

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

func (c *Charmander[T]) InflictDamage(other Pokemon) {
    other.ReceiveDamage(float64(c.AttackPower))
}</code>

Penukaran ini disusun kerana float64 boleh ditukar kepada semua jenis dalam set jenis F (float32 dan float64).

Perhatikan bahawa penukaran T(kerosakan) boleh mengakibatkan kehilangan ketepatan jika T dibuat seketika dengan float32. Walau bagaimanapun, ini tidak mungkin menjadi kebimbangan dalam kes penggunaan khusus ini.

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

Kenyataan:
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