Go에서 일반 유형 구현
Go 1.18에서 제네릭은 복잡한 개념을 표현하는 데 유망한 가능성을 제공합니다. 그러한 개념 중 하나는 A 유형 또는 B 유형의 값을 나타낼 수 있는 E 유형입니다. 이 기사에서는 Go의 새로운 제네릭 패러다임 내에서 두 유형 중 하나를 구현하는 잠재적인 방법을 탐구합니다.
이 문제는 Go의 제한 사항에서 발생합니다. 유형 매개변수가 없는 인터페이스 메소드. 이러한 장애물로 인해 Each 인터페이스를 직접 구현할 수 없습니다.
Optional을 사용하여 둘 중 하나를 에뮬레이트
한 가지 접근 방식은 Option의 함수형 프로그래밍 개념을 적용하는 것입니다. Optional[T] 인터페이스는 T 유형의 값 또는 값의 부재를 나타낼 수 있습니다. Go의 제네릭을 활용하여 이 아이디어를 확장하여 A 또는 B에 대한 Optional을 만들 수 있습니다.
type Optional[T any] interface { get() (T, error) } func CreateNone[T any]() Optional[T] { return None[T]{} } func CreateSome[T any](data T) Optional[T] { return Some[T]{data} }
둘 중 하나 구현
Optional이 설정되면 이제 다음을 수행할 수 있습니다. 이를 활용하는 두 유형 중 하나를 구성합니다.
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] }
왼쪽 및 오른쪽 구조체는 다음 값을 나타냅니다. 각각 A와 B를 입력합니다. is_left 및 is_right는 어느 쪽이 보유하는지를 나타냅니다. find_left 및 find_right는 해당 값에 대한 Optional 래퍼를 제공합니다.
type Left[A, B any] struct { data A } func left[A, B any](data A) Either[A, B] { return Left[A, B]{data} } type Right[A, B any] struct { data B } func right[A, B any](data B) Either[A, B] { return Right[A, B]{data} }
사용
구현된 두 유형 모두 다음과 같이 활용할 수 있습니다.
var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") if e1.is_left() { if l, err := e1.find_left().get(); err == nil { fmt.Printf("The int is: %d\n", l) } }
이 접근 방식은 Go의 인터페이스 제약 조건을 존중하면서 양쪽 유형을 효과적으로 에뮬레이트합니다. 이는 두 가지 유형 중 하나에 속할 수 있는 값의 표현을 가능하게 하여 Go 코드에서 더 큰 유연성과 유형 안전성을 제공합니다.
위 내용은 Generic과 Optional을 사용하여 Go에서 Generic Type을 어떻게 구현할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!