> 백엔드 개발 > Golang > Generic과 Optional을 사용하여 Go에서 Generic Type을 어떻게 구현할 수 있나요?

Generic과 Optional을 사용하여 Go에서 Generic Type을 어떻게 구현할 수 있나요?

Barbara Streisand
풀어 주다: 2024-12-24 19:55:25
원래의
587명이 탐색했습니다.

How Can We Implement a Generic Either Type in Go Using Generics and Optionals?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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