Go 1.18에 제네릭이 도입되면서 E 유형과 같은 일반 데이터 구조를 만드는 것이 가능해졌습니다. 두 가지 가능한 값 중 하나를 나타낼 수 있습니다. 이는 오류 처리를 위한 관용적인 Go 접근 방식에서와 같이 값과 오류를 모두 반환하는 제한 사항을 해결합니다.
일반적인 Each 유형을 구현하는 한 가지 접근 방식은 None 유형과 Optional 인터페이스를 활용하는 것입니다. None은 값이 없음을 나타내고, Optional은 값이나 오류를 검색하는 방법을 제공합니다. 또한 Left 및 Right 유형은 둘 중 하나가 보유할 수 있는 두 가지 가능한 값을 나타내도록 정의됩니다.
type Optional[T any] interface { get() (T, error) } type None[T any] struct {} type Some[T any] struct { data T }
Ether 인터페이스는 왼쪽 또는 오른쪽 값을 보유하는지 확인하는 메소드와 두 유형 모두에 액세스하는 메소드를 제공합니다. find 메소드를 사용하여 값을 검색합니다.
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] } type Left[A, B any] struct { data A } type Right[A, B any] struct { data B }
둘 중 하나의 인스턴스를 생성하고 해당 인스턴스에 액세스할 수 있도록 도우미 함수가 제공됩니다. 값입니다.
func left[A, B any](data A) Either[A, B] func right[A, B any](data B) Either[A, B]
다음 예에서는 둘 중 하나 유형의 사용법을 보여줍니다.
var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") fmt.Println(e1) fmt.Println(e2)
출력은 다음과 같습니다.
left(4143) right(G4143)
is_left 및 is_right 메소드를 사용하면 둘 중 하나가 보유하는 값 유형을 판별할 수 있습니다. find_left 및 find_right 메소드를 사용하면 실제 값을 검색할 수 있습니다.
if e1.is_left() { if l, err := e1.find_left().get(); err == nil { fmt.Printf("The int is: %d\n", l) } else { fmt.Fprintln(os.Stderr, err) } } if e2.is_right() { if r, err := e2.find_right().get(); err == nil { fmt.Printf("The string is: %s\n", r) } else { fmt.Fprintln(os.Stderr, err) } }
이 예는 Elease 유형을 사용하여 유연하고 유형이 안전한 방식으로 다양한 유형의 값을 표현하고 처리하는 방법을 보여줍니다.
위 내용은 유연하고 유형이 안전한 유형을 구현하기 위해 Go의 제네릭을 어떻게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!