>백엔드 개발 >Golang >Go Generics는 인터페이스 메소드 정의에서 유형 매개변수를 처리할 수 있나요?

Go Generics는 인터페이스 메소드 정의에서 유형 매개변수를 처리할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-06 10:19:14928검색

Can Go Generics Handle Type Parameters in Interface Method Definitions?

인터페이스 메서드의 유형 매개변수: Go Generics의 진퇴양난

Go가 제네릭을 추구하는 과정에서 특이한 걸림돌이 나타납니다. 바로 유형 금지입니다. 인터페이스 메소드 정의 내의 매개변수. 키/값 저장소를 추상화하려고 시도하는 개발자에게 발생하는 이러한 제한으로 인해 왜 그리고 솔루션이 존재하는지 궁금해집니다.

제한 뒤에 숨어 있는 이론적 근거

The Go 핵심 팀은 여러 인터페이스의 유형 매개변수를 허용하지 않도록 의도적으로 디자인 결정을 내렸습니다. 이유:

  1. 해석의 모호함: 인터페이스의 유형 매개변수는 메소드의 다중 해석으로 이어질 수 있어 일관된 구현 규칙을 설정하기 어렵게 만듭니다.
  2. 컴파일 시간 성능: 유형 매개변수를 확인하기 위해 컴파일 시간에 전체 유형 시스템 계층 구조를 탐색하면 상당한 영향을 미칠 수 있습니다. 성능.
  3. 런타임 리플렉션: 인터페이스에서 유형 매개변수를 허용하려면 실제 유형 매개변수를 결정하기 위해 런타임 리플렉션이 필요하므로 실행 속도가 느려집니다.
  4. 구현 충돌: 매개변수화된 메서드는 본질적으로 독립적인 함수이므로 구현 개념과 충돌할 수 있습니다.

제한 우회

제한이 좌절스러울 수 있지만 극복할 수 없는 것은 아닙니다. 유형 매개변수 제안에서 제안된 솔루션은 유형 매개변수를 인터페이스 유형 정의 자체로 이동하는 것입니다.

type Reader[V Unmarshaler] interface {
    Read(bucket []byte, k ...[]byte) ([][]byte, error)
    ReadDoc(bucket []byte, factory func() (V, error), k ...[]byte) ([]V, error)
}

type Unmarshaler interface {
    UnmarshalKV(v []byte) error
}

이 접근 방식을 사용하면 언어의 디자인 제약 조건을 유지하면서 유형이 안전한 일반 인터페이스를 사용할 수 있습니다.

위 내용은 Go Generics는 인터페이스 메소드 정의에서 유형 매개변수를 처리할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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