리플렉션을 사용하여 내장되지 않은 유형 식별
문제:
[ ]바이트 및 유형 A []바이트는 리플렉션을 사용하는 것이 어려운 것으로 판명되었습니다. Reflect.TypeOf(A{}).Kind는 둘 다 바이트 조각으로 나타냅니다. 미리 정의된 유형 목록에 의존하지 않고 이러한 유형을 구별할 수 있는 방법을 찾는 것이 필요합니다.
배경:
Go의 유형은 이름이 지정된( 유형 이름 포함) 또는 이름 없음(유형 리터럴 사용). 미리 선언된 유형(예: string 또는 int)에는 이름이 지정되지만 유형 리터럴(예: []int 또는 struct{i int})을 사용하여 생성된 유형에는 이름이 지정되지 않습니다.
해결책:
사용 Type.PkgPath():
Type.PkgPath()는 명명된 유형의 패키지 경로를 제공합니다. 미리 선언되었거나 이름이 지정되지 않은 유형의 경우 이 경로는 비어 있습니다. 따라서 Type.PkgPath()가 비어 있지 않은 문자열을 반환하는지 확인하여 기본 제공 유형이 아닌 유형을 식별할 수 있습니다.
사용자 정의 유형에서 파생된 이름 없는 유형 처리:
사용자 정의 유형과 함께 유형 리터럴을 사용하면 이름이 지정되지 않은 유형(예: []A)이 발생할 수 있습니다. 이름이 지정되지 않은 유형이 사용자 정의 유형에서 파생되었는지 확인하려면 Type.Elem():
if elem := t.Elem(); elem.Kind() == reflect.Ptr || elem.Kind() == reflect.Struct { // Recursively check elem }
특수 사례:
구현 예:
다음 코드는 내장되지 않은 항목을 식별하기 위해 유틸리티 함수 isCustom을 정의합니다. 유형:func isCustom(t reflect.Type) bool { if t.PkgPath() != "" { return true } // Handle special cases and recursion for unnamed types return false }
솔루션 테스트:
위 내용은 리플렉션을 사용하여 Go에서 내장 유형과 사용자 정의 유형을 어떻게 구별할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!