>백엔드 개발 >Golang >Go Generics에서 재귀 유형 제약 조건을 어떻게 달성할 수 있나요?

Go Generics에서 재귀 유형 제약 조건을 어떻게 달성할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-12-22 06:57:44517검색

How Can I Achieve Recursive Type Constraints in Go Generics?

미리 정의된 유형을 사용한 재귀 유형 제약 조건

Go 제네릭에서는 인터페이스를 사용하여 제네릭 유형에 대한 유형 제약 조건을 지정할 수 있습니다. 그러나 제네릭 형식 자체의 인수를 사용하여 메서드를 구현해야 하는 제약 조건을 정의하는 것은 어려울 수 있습니다.

현재 초안 제한

현재 Go 제네릭 초안에서는 다음을 허용하지 않습니다. 재귀적 유형 제약으로 인해 원하는 동작을 달성하는 것이 불가능해집니다. 예를 들어 다음 인터페이스를 고려해보세요.

type Lesser interface {
    Less(rhs Lesser) bool
}

Int와 같은 사용자 정의 유형에 대해 이 인터페이스를 구현할 수 있습니다.

type Int int

func (lhs Int) Less(rhs Int) bool {
    return lhs < rhs
}

그러나 다음 코드는 컴파일에 실패합니다. Int는 Lesser 인터페이스를 만족하지 않습니다:

func IsLess[T Lesser](lhs, rhs T) bool {
    return lhs.Less(rhs)
}

func main() {
    IsLess[Int](Int(10), Int(20))
}

미리 정의된 솔루션을 사용한 솔루션 인터페이스

이 제한 사항에 대한 해결 방법은 자신을 유형 매개변수로 참조하는 일반 인터페이스를 정의하는 것입니다.

type Lesser[T any] interface {
    Less(T) bool
}

이 인터페이스는 Lesser 인터페이스를 구현하는 모든 유형이 Less를 가져야 함을 지정합니다. 동일한 유형의 인수를 취하는 메서드입니다.

그런 다음 이 제네릭을 사용하여 IsLess 함수를 정의할 수 있습니다. 인터페이스:

func IsLess[T Lesser[T]](x, y T) bool {
    return x.Less(y)
}

이제 Lesser 제약 조건을 충족하는 사용자 정의 유형을 구현할 수 있습니다.

type Apple int

func (a Apple) Less(other Apple) bool {
    return a < other
}

type Orange int

func (o Orange) Less(other Orange) bool {
    return o < other
}

이러한 사용자 정의 유형과 함께 IsLess 함수를 사용하면 올바른 동작이 발생합니다.

func main() {
    fmt.Println(IsLess(Apple(10), Apple(20)))   // true
    fmt.Println(IsLess(Orange(30), Orange(15))) // false
}

이 솔루션은 제네릭 인수가 있는 메서드 구현을 요구하여 재귀 유형 제약 조건을 효과적으로 적용합니다. 입력하세요.

위 내용은 Go Generics에서 재귀 유형 제약 조건을 어떻게 달성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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