>  기사  >  백엔드 개발  >  구체적인 유형이 필요한 경우 Go 함수에서 제한된 유형을 인수로 어떻게 사용할 수 있나요?

구체적인 유형이 필요한 경우 Go 함수에서 제한된 유형을 인수로 어떻게 사용할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-10-27 07:15:29185검색

 How Can I Use Constrained Types as Arguments in Go Functions When They Expect Concrete Types?

Go 1.18 제네릭에서 제한된 유형을 인수로 사용

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.