>  기사  >  백엔드 개발  >  제네릭: 인터페이스에 내장된 제약 조건 및 구조

제네릭: 인터페이스에 내장된 제약 조건 및 구조

王林
王林앞으로
2024-02-08 23:21:19534검색

제네릭: 인터페이스에 내장된 제약 조건 및 구조

php 편집기 Xiaoxin이 제네릭에 대한 소개를 제공합니다. 제네릭은 코드를 작성할 때 보다 유연하고 효율적으로 작업할 수 있도록 인터페이스에 포함된 제약 조건 및 구조입니다. 제네릭을 사용하면 컴파일 타임에 유형 오류를 찾아 해결할 수 있어 코드 가독성과 유지 관리성이 향상됩니다. Generics는 또한 보다 일반적인 데이터 구조와 알고리즘을 설계하여 코드 재사용성을 향상시키는 데 도움이 될 수 있습니다. 이 기사에서는 제네릭 프로그래밍을 더 잘 이해하고 적용하는 데 도움이 되도록 제네릭의 개념, 사용법 및 실제 응용 프로그램을 자세히 살펴보겠습니다.

문제 내용

다음 코드는 컴파일 및 보고할 수 없습니다. ./main.go:35:7: test does not meet constraint (test missing in main.structwithname)

으아악

그러나 structwithname를 주석 처리하고 ~struct 블록의 주석 처리를 제거하면 정상적으로 컴파일됩니다. 둘 사이의 의미적 차이를 이해할 수 없습니다.

내가 하려는 것은 일반적인 방식으로 구조체를 처리할 수 있는 일반적인 메서드를 갖는 것입니다. 즉, x := s{}외부 라이브러리에 전달합니다. 이 경우에는 Terraform 공급자를 위한 것이며 리소스의 코드가 매우 유사합니다. 제 경우에는 리소스가 매우 유사하며 일부는 그 사이에 있는 기존 공급자에서 볼 수 있는 중복의 양 때문에 약간 신경이 쓰입니다. 기본 구조에는 하나 또는 두 개의 필드만 있습니다. 나는 유사한 작업을 모두 수행하고 다른 곳에서는 특수성만 갖는 일반적인 메서드 집합을 작성할 수 있기를 원합니다(이런!).

아직 바둑 여정의 초기 단계에 있어서 컴파일러 오류를 이해할 수 없습니다.

Solution

내가 올바르게 이해했다면 당신이 정말로 원하는 것은 불가능합니다. Go 제네릭은 구조 필드의 하위 집합에 대한 액세스를 지원하지 않습니다.

관련된 버그에 관해서는...

유형의 이름은 유형의 ID를 지정하며 서로 다른 이름(서로의 별칭 아님)을 가진 두 유형은 항상 다르기 때문에 testteststructwithname는 서로 다른 두 유형입니다. 유일한 공통점은 기본 유형입니다.

type Constraint 인터페이스 { structwithname } 인터페이스는 단 하나의 유형, 즉 type constraint 接口 { structwithname } 接口是一个仅包含一种类型的类型集,即 structwithname,并且由于 test 不是该类型集的成员,这意味着不可能使用 test만 포함하는 유형 집합이며, test는 이 유형 집합의 멤버가 아니기 때문에 이 제약 조건을 충족하기 위해 test 유형을 사용할 수 없음을 의미합니다.

type struct { name string } 是一个无名类型,任何无名类型的底层类型都是该类型本身,即 struct 的底层类型 { name string } is struct { name string }은 이름이 지정되지 않은 유형이며 이름이 지정되지 않은 모든 유형의 기본 유형은 유형 자체, 즉 struct { name string }

is

~t,表示任何类型,其底层类型t의 기본 유형입니다.

제약조건의 유형 앞에 있는 물결표, 즉 ~t

기본 유형

t와 동일한

모든

유형을 나타냅니다. 또는 더 정확하게는 struct { name string }

~t 형식의 항목 유형 집합은 기본 유형이 t인 모든 유형의 집합입니다. 🎜 🎜그러면 🎜 으아악 🎜그러면 제한된 유형 집합에는 기본 유형이 🎜인 모든 유형이 포함됩니다. 🎜

위 내용은 제네릭: 인터페이스에 내장된 제약 조건 및 구조의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제