>백엔드 개발 >Golang >두 가지 유형 중 하나를 사용하여 Generics가 Go에서 오류 처리를 어떻게 개선할 수 있습니까?

두 가지 유형 중 하나를 사용하여 Generics가 Go에서 오류 처리를 어떻게 개선할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-11 14:32:14237검색

How Can Generics Improve Error Handling in Go Using an Either Type?

Go에서 일반 유형을 사용한 오류 처리

Go 1.18에서는 제네릭이 도입되어 향상된 오류 처리 가능성을 제공합니다. 'Either[A,B]' 유형을 생성하면 유형 A 또는 B 중 하나일 수 있는 값을 나타내는 것이 가능해집니다.

이 접근 방식은 '일반' 유형을 모두 반환하는 기존 Go 관용어와 다릅니다. ' 값과 오류 값. 여기서 nil 오류는 성공적인 반환을 나타냅니다. 그러나 원하는 동작이 값이 둘 다 아닌 A 또는 B임을 전달하는 것이라면 문제가 될 수 있습니다.

인터페이스 메서드 제한 극복

인터페이스 메소드에는 유형 매개변수가 없어야 한다는 제한으로 인해 Switch 메소드에 대한 유형 매개변수를 사용하여 인터페이스를 정의하는 데 실패했습니다. 이를 회피하기 위한 대안적인 접근 방식은 Optionality 개념을 도입하는 것입니다.

Optionality와 두 가지 유형

Optional 유형은 다음을 갖는 인터페이스로 정의할 수 있습니다. 값과 nil 오류를 반환하거나 값이 없으면 오류를 반환하는 get() 메서드입니다. 그런 다음 선택성 개념의 관점에서 Each 유형을 정의할 수 있습니다.

type Either[A, B any] interface {
    is_left() bool
    is_right() bool
    find_left() Optional[A]
    find_right() Optional[B]
}

이 접근 방식을 사용하면 Each 유형을 왼쪽 및 오른쪽 변형으로 구현할 수 있습니다. 이는 A 또는 유형 값의 존재를 나타냅니다. B.

type Left[A, B any] struct {
    data A
}

type Right[A, B any] struct {
    data B
}

실제 예시

다음 예시 실제 동작 중인 Each 유형을 보여줍니다.

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)
    } else {
        fmt.Fprintln(os.Stderr, err)
    }
}
...

이 코드는 Each 값을 효과적으로 캡처하고 처리하며, Optionality 개념이 Go에서 오류를 처리하거나 선택적 값을 나타내는 유연하고 표현적인 방법을 제공하는 방법을 보여줍니다.

위 내용은 두 가지 유형 중 하나를 사용하여 Generics가 Go에서 오류 처리를 어떻게 개선할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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