Go 1.18 Generics에서 제한된 유형을 함수 인수로 처리
Go 1.18에는 제네릭이 도입되어 개발자가 임의에서 작동하는 함수와 유형을 만들 수 있습니다. 데이터 유형. 그러나 제한된 유형을 구체적인 유형이 필요한 함수에 인수로 전달하려고 하면 컴파일러에서 오류가 발생할 수 있습니다.
이 문제를 설명하려면 다음 예를 고려하세요.
<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>
여기서 Charmander는 Pokemon 인터페이스를 구현하고 float32 또는 float64여야 하는 일반 유형 매개변수 F를 허용합니다.
<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>
그러나 컴파일러는 IntributeDamage 메서드에서 c.라는 오류를 발생시킵니다. AttackPower는 other.ReceiveDamage 함수의 float64 인수로 사용할 수 없습니다. 이는 Charmander 구조체를 *Charmander[float64]로 인스턴스화했음에도 불구하고 컴파일러가 여전히 AttackPower를 F 유형으로 간주하기 때문입니다.
이 문제에 대한 해결책은 유형 변환을 사용하는 데 있습니다. ReceiverDamage는 float64를 예상하지만 AttackPower는 여전히 F로 제한되어 있습니다. 따라서 AttackPower를 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>
float64는 F(float32) 유형 세트의 모든 유형으로 변환 가능하기 때문에 이러한 변환은 컴파일됩니다. 및 float64).
T가 float32로 인스턴스화되면 T(damage) 변환으로 인해 정밀도가 손실될 수 있습니다. 그러나 이 특정 사용 사례에서는 이는 문제가 되지 않을 것입니다.
위 내용은 Go 1.18 Generics에서 제한된 유형을 함수 인수로 전달하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!