Reflect를 사용하여 내장되지 않은 유형 식별
도전
구분해야 함 Reflect 패키지를 사용하여 []byte의 A []byte 유형과 같은 유형을 사용합니다. Reflect.TypeOf(A{}).Kind는 두 유형 모두에 대해 Slice를 반환하므로 구분하기가 어렵습니다.
유형에 대한 배경
접근법
반사 방법을 사용하여 type:
특수 사례
구현
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 }
테스트 중
이를 다양한 분야에 적용 유형:
fmt.Println(isCustom(reflect.TypeOf(""))) // false fmt.Println(isCustom(reflect.TypeOf(int(2)))) // false fmt.Println(isCustom(reflect.TypeOf([]int{}))) // false fmt.Println(isCustom(reflect.TypeOf(struct{ i int }{}))) // false fmt.Println(isCustom(reflect.TypeOf(&i))) // false fmt.Println(isCustom(reflect.TypeOf(map[string]int{}))) // false fmt.Println(isCustom(reflect.TypeOf(A{}))) // true fmt.Println(isCustom(reflect.TypeOf(&A{}))) // true fmt.Println(isCustom(reflect.TypeOf([]A{}))) // true fmt.Println(isCustom(reflect.TypeOf([][]A{}))) // true fmt.Println(isCustom(reflect.TypeOf(struct{ a A }{}))) // true fmt.Println(isCustom(reflect.TypeOf(map[K]int{}))) // true fmt.Println(isCustom(reflect.TypeOf(map[string]K{}))) // true
reflect 패키지를 효과적으로 사용하여 내장 유형과 사용자 정의 유형을 구별하는 능력을 보여줍니다.
위 내용은 Go의 `reflect` 패키지를 사용하여 내장 유형과 사용자 정의 유형을 어떻게 구별할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!