미리 정의된 유형을 사용한 재귀 유형 제약 조건
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!