Menggunakan Jenis Terkekang sebagai Argumen dalam Fungsi
Dalam Go 1.18, generik menyediakan cara untuk menentukan jenis dengan parameter jenis, terhad kepada jenis tertentu set. Walau bagaimanapun, anda mungkin menghadapi ralat apabila menggunakan jenis terkurung sebagai hujah kepada fungsi yang mengharapkan jenis konkrit. Mari kita teroka penyelesaian menggunakan penukaran jenis.
Pertimbangkan contoh yang disediakan:
<code class="go">type Pokemon interface { ReceiveDamage(float64) InflictDamage(Pokemon) } type Float interface { float32 | float64 } type Charmander[F Float] struct { Health F AttackPower F } func (c *Charmander[float64]) ReceiveDamage(damage float64) { c.Health -= damage } func (c *Charmander[float64]) InflictDamage(other Pokemon) { other.ReceiveDamage(c.AttackPower) }</code>
Apabila anda cuba menyusun atur cara ini, anda akan menghadapi ralat kerana c.AttackPower adalah jenis F dikekang kepada float64, tetapi yang lain.ReceiveDamage() menjangkakan hujah float64.
Untuk menyelesaikan isu ini, anda perlu menukar secara eksplisit c.AttackPower kepada jenis konkrit yang memenuhi Float. Dalam kes ini, kedua-dua float32 dan float64 memenuhi kekangan, jadi anda boleh menukar kepada salah satu.
Kaedah yang dikemas kini menjadi:
<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>
Dengan penukaran ini, atur cara akan berjaya disusun. Ambil perhatian bahawa apabila membuat instantiat jenis Charmander, anda mesti menentukan jenis konkrit yang F harus diikat, seperti *Charmander[float64].
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat Jenis Apabila Menggunakan Jenis Terkandas sebagai Argumen dalam Fungsi Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!