Go 1.18에서 제네릭은 유형 매개변수를 제한하는 기능을 도입하여 더 큰 유연성과 유형 안전성을 허용합니다. 그러나 제한된 유형을 구체적인 유형을 기대하는 함수에 대한 인수로 사용하면 예상치 못한 동작이 발생할 수 있습니다.
Float(float32)로 제한된 유형 매개변수를 사용하여 Pokemon 인터페이스와 Charmander 구조체를 정의하는 다음 예를 생각해 보세요. 또는 float64):
<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의 AttackPower 필드를 사용하여 IntributeDamage 방법으로 피해를 입히는 것입니다. 그러나 이 방법을 구현할 때 다음 오류가 발생합니다.
cannot use c.AttackPower (variable of type float64 constrained by Float) as float64 value in argument to other.ReceiveDamage compiler(IncompatibleAssign)
이 오류는 Charmander 구조체를 *Charmander[float64]로 인스턴스화했음에도 불구하고 AttackPower 필드가 여전히 F 유형이기 때문에 발생합니다. 부동으로 제한됩니다. 이 맥락에서 Float는 float32와 float64를 모두 포함하며 컴파일러는 둘 사이를 자동으로 변환할 수 없습니다.
이 문제를 해결하려면 AttackPower 필드를 other.ReceiveDamage의 예상 유형인 float64로 명시적으로 변환해야 합니다. 메서드 인수:
<code class="go">func (c *Charmander[T]) InflictDamage(other Pokemon) { other.ReceiveDamage(float64(c.AttackPower)) }</code>
이 변환을 통해 AttackPower 값이 other.ReceiveDamage 메서드에 올바르게 전달됩니다. 또한 유형 일관성을 유지하기 위해 receiveDamage 메소드에서 손상 매개변수를 F 유형으로 변환해야 합니다.
<code class="go">func (c *Charmander[T]) ReceiveDamage(damage float64) { c.Health -= T(damage) }</code>
이러한 유형 변환을 구현하면 제한된 유형을 구체적인 유형을 기대하는 함수에 대한 인수로 사용할 수 있습니다. 유형 안전성을 유지하고 컴파일러 오류를 방지합니다. 서로 다른 부동 소수점 유형 간에 변환할 때 유형 변환으로 인해 정밀도가 손실될 수 있다는 점에 유의하는 것이 중요합니다.
위 내용은 구체적인 유형이 필요한 경우 Go 함수에서 제한된 유형을 인수로 어떻게 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!