Rumah >pembangunan bahagian belakang >Golang >Bagaimana Mengendalikan Jenis Terkandas sebagai Argumen dalam Go 1.18 Generik?

Bagaimana Mengendalikan Jenis Terkandas sebagai Argumen dalam Go 1.18 Generik?

Susan Sarandon
Susan Sarandonasal
2024-10-27 08:08:31417semak imbas

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>

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>

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>

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>

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!

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