Reflect를 사용하여 내장되지 않은 유형 식별
질문:
다음과 같은 유형 구별 []byte 및 유형 A []byte를 사용하여 Reflect를 사용하는 것은 일반적인 문제입니다. 정의된 유형 목록에 의존하지 않고 이러한 유형을 어떻게 구별할 수 있습니까?
소개:
유형에 대한 배경:
Go에서 유형 분류를 이해하는 것은 매우 중요합니다. 이름이 지정된 유형과 이름이 지정되지 않은 유형이라는 두 가지 주요 범주가 있습니다. 명명된 유형은 type 키워드를 사용하여 선언되고, 명명되지 않은 유형은 유형 리터럴을 사용하여 생성됩니다. int 및 string과 같이 미리 선언된 유형도 즉시 사용할 수 있습니다.
Type.Name() 및 Type.PkgPath() 사용:
Type.Name ()는 명명된 유형의 이름을 반환하는 반면, Type.PkgPath()는 명명된 유형과 미리 선언된 유형 모두에 대한 패키지 경로를 반환합니다. 이를 통해 명명되지 않은 유형(빈 Type.Name())을 명명된 유형과 미리 선언된 유형에서 분리할 수 있습니다.
특수 사례:
익명 구조체 유형과 지도 유형에는 특수한 항목이 필요합니다. 고려 사항. 익명 구조체 유형에는 사용자 정의 유형의 필드가 포함될 수 있으므로 Type.Elem()을 사용하여 필드를 재귀적으로 확인해야 합니다. 마찬가지로, 맵의 경우 키와 값 유형을 모두 확인해야 합니다.
구현 예:
다음은 내장과 비 내장을 구별하는 코드 예입니다. 유형:
func isCustom(t reflect.Type) bool { if t.PkgPath() != "" { return true } if k := t.Kind(); k == reflect.Array || k == reflect.Chan || k == reflect.Map || k == reflect.Ptr || k == reflect.Slice { return isCustom(t.Elem()) || k == reflect.Map && isCustom(t.Key()) } else if k == reflect.Struct { for i := t.NumField() - 1; i >= 0; i-- { if isCustom(t.Field(i).Type) { return true } } } return false }
사용법:
다양한 유형으로 isCustom() 함수를 테스트할 수 있습니다:
fmt.Println(isCustom(reflect.TypeOf(int(2)))) // false fmt.Println(isCustom(reflect.TypeOf(A{}))) // true fmt.Println(isCustom(reflect.TypeOf(map[K]int{}))) // true
위 내용은 유형 목록 없이 리플렉션을 사용하여 Go에서 내장되지 않은 유형을 어떻게 식별할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!