> 백엔드 개발 > Golang > 유형 목록 없이 리플렉션을 사용하여 Go에서 내장되지 않은 유형을 어떻게 식별할 수 있나요?

유형 목록 없이 리플렉션을 사용하여 Go에서 내장되지 않은 유형을 어떻게 식별할 수 있나요?

Mary-Kate Olsen
풀어 주다: 2024-12-27 13:12:12
원래의
579명이 탐색했습니다.

How Can We Identify Non-Builtin Types in Go Using Reflection Without Type Listing?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿