Go 1.18 Generics에서 제한된 유형을 인수로 처리하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-10-27 08:08:31
원래의
312명이 탐색했습니다.

How to Handle Constrained Types as Arguments in Go 1.18 Generics?

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

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입니다. 그러나 other.ReceiveDamage()에서 AttackPower(제한된 유형)를 float64 인수로 사용하려고 하면 오류가 발생합니다.

<code class="go">func (c *Charmander[float64]) InflictDamage(other Pokemon) {
    other.ReceiveDamage(c.AttackPower)
}</code>
로그인 후 복사

호환성을 위한 유형 변환

이 문제를 해결하려면 제한된 유형과 함수에서 예상하는 구체적인 유형 간의 호환성을 보장하기 위해 유형 변환을 사용해야 합니다. 이는 float64로 제한된 경우에도 F가 float64와 동일하지 않기 때문입니다.

수정된 코드는 다음과 같습니다.

<code class="go">func (c *Charmander[T]) InflictDamage(other Pokemon) {
    other.ReceiveDamage(float64(c.AttackPower))
}</code>
로그인 후 복사

마찬가지로, ReceiverDamage() 메서드는 제한된 유형( Health) 손상 인수를 제한된 유형으로 변환하여:

<code class="go">func (c *Charmander[T]) ReceiveDamage(damage float64) {
    c.Health -= T(damage)
}</code>
로그인 후 복사

정밀도 고려 사항

float64에서 float32로 변환된다는 점에 유의하는 것이 중요합니다(F float32로 인스턴스화됨)은 정밀도가 손실될 수 있습니다. 특정 사용 사례에서는 이를 고려해야 할 수도 있습니다.

위 내용은 Go 1.18 Generics에서 제한된 유형을 인수로 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!